Substring like in PHP's substr()?

Discussion in 'Ruby' started by Joshua Muheim, Apr 9, 2007.

  1. Hi all

    I'm looking for the coolest way to get the substring

    /Webwork/pgbookings

    out of

    /Users/Josh/Webwork/pgbookings

    The part /Users/Josh is saved in the variable my_var.

    In PHP I would do something like the following:

    substr(/Users/Josh/Webwork/pgbookings, strlen(my_var)) # =>
    /Webwork/pgbookings

    What's the fastest way to do this in Ruby? :)
    Josh

    --
    Posted via http://www.ruby-forum.com/.
     
    Joshua Muheim, Apr 9, 2007
    #1
    1. Advertising

  2. On Apr 9, 2007, at 6:52 AM, Joshua Muheim wrote:

    > Hi all
    >
    > I'm looking for the coolest way to get the substring
    >
    > /Webwork/pgbookings
    >
    > out of
    >
    > /Users/Josh/Webwork/pgbookings
    >
    > The part /Users/Josh is saved in the variable my_var.
    >
    > In PHP I would do something like the following:
    >
    > substr(/Users/Josh/Webwork/pgbookings, strlen(my_var)) # =>
    > /Webwork/pgbookings
    >
    > What's the fastest way to do this in Ruby? :)


    I'm not sure which way is faster, so let's ask Ruby to time some of
    my ideas:

    #!/usr/bin/env ruby -w

    require "benchmark"

    data = "/Users/Josh/Webwork/pgbookings"
    prefix = "/Webwork/pgbookings"

    TESTS = 1_000_000
    Benchmark.bmbm do |results|
    results.report("[i..-i]:") { TESTS.times { data
    [prefix.length..-1] } }
    results.report("[i, l]:") { TESTS.times { data[prefix.length,
    data.length] } }
    results.report("sub():") { TESTS.times { data.sub(/\A#{prefix}/,
    "") } }
    results.report("[re, c]:") { TESTS.times { data[/\A#{prefix}(.+)/,
    1] } }
    end
    # >> Rehearsal --------------------------------------------
    # >> [i..-i]: 2.500000 0.000000 2.500000 ( 2.511868)
    # >> [i, l]: 0.630000 0.000000 0.630000 ( 0.634460)
    # >> sub(): 6.800000 0.020000 6.820000 ( 6.850561)
    # >> [re, c]: 7.180000 0.010000 7.190000 ( 7.204910)
    # >> ---------------------------------- total: 17.140000sec
    # >>
    # >> user system total real
    # >> [i..-i]: 2.500000 0.000000 2.500000 ( 2.500795)
    # >> [i, l]: 0.630000 0.010000 0.640000 ( 0.633458)
    # >> sub(): 6.840000 0.000000 6.840000 ( 6.853133)
    # >> [re, c]: 7.110000 0.010000 7.120000 ( 7.130398)

    __END__

    Hope that helps.

    James Edward Gray II
     
    James Edward Gray II, Apr 9, 2007
    #2
    1. Advertising

  3. Jamal Soueidan, Apr 9, 2007
    #3
  4. On 4/9/07, James Edward Gray II <> wrote:
    >
    > data = "/Users/Josh/Webwork/pgbookings"
    > prefix = "/Webwork/pgbookings"


    I think you meant
    prefix = "/Users/Josh"

    This doesn't affect the qualitative results of the benchmark but it
    does change it to do what the OP was trying to do.

    Note that "/Webwork/pgbookings" is NOT a prefix of
    "/Users/Josh/Webwork/pgbookings"

    And cosmetically there's a typo:

    > results.report("[i..-i]:") { TESTS.times { data
    > [prefix.length..-1] } }


    should be:

    results.report("[i..-1:") { TESTS.times { data[prefix.length..-1] } }

    --
    Rick DeNatale

    My blog on Ruby
    http://talklikeaduck.denhaven2.com/
     
    Rick DeNatale, Apr 9, 2007
    #4
  5. On Apr 9, 2007, at 8:33 AM, Rick DeNatale wrote:

    > On 4/9/07, James Edward Gray II <> wrote:
    >>
    >> data = "/Users/Josh/Webwork/pgbookings"
    >> prefix = "/Webwork/pgbookings"

    >
    > I think you meant
    > prefix = "/Users/Josh"
    >
    > This doesn't affect the qualitative results of the benchmark but it
    > does change it to do what the OP was trying to do.


    Oops, I did. Thank you.

    > And cosmetically there's a typo:
    >
    >> results.report("[i..-i]:") { TESTS.times { data
    >> [prefix.length..-1] } }

    >
    > should be:
    >
    > results.report("[i..-1:") { TESTS.times { data
    > [prefix.length..-1] } }


    Yeah, I blew that one, didn't I?

    Thanks for the corrections.

    James Edward Gray II
     
    James Edward Gray II, Apr 9, 2007
    #5
  6. Joshua Muheim, Apr 9, 2007
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Kees Hoogendijk

    getline and substr

    Kees Hoogendijk, Dec 20, 2003, in forum: C++
    Replies:
    4
    Views:
    562
    Kees Hoogendijk
    Dec 21, 2003
  2. Rajive Narain
    Replies:
    0
    Views:
    1,988
    Rajive Narain
    Sep 18, 2009
  3. Replies:
    3
    Views:
    212
    Sherm Pendley
    Aug 3, 2005
  4. Daniel  Reardon
    Replies:
    1
    Views:
    108
    Richard Cornford
    Nov 20, 2006
  5. Ross
    Replies:
    4
    Views:
    162
    Thomas 'PointedEars' Lahn
    Nov 4, 2009
Loading...

Share This Page