gsub not working. Ruby thinks I'm in an array?

Discussion in 'Ruby' started by Peter Bailey, Sep 21, 2007.

  1. Peter Bailey

    Peter Bailey Guest

    I've chunked up a huge text file into arrays of discrete text groups. I
    want to go into each of those text groups and convert a bunch of stuff.
    I've proved that I've got my array OK, and, I've proved that I can do a
    "put" of any of the discrete text groups. But, in my first gsub! to
    convert stuff in these text groups, Ruby is complaining that I'm doing a
    gsub! in an array. I'm getting the following error message:

    Exception: private method `gsub' called for #<Array:0x2e40910>

    Here's the lines where this starts:
    registries = []
    registries = xmlfile.scan(/<registration>(.*? )<\/registration>/im)
    #puts registries[100]

    registries.sort!
    registries.each do |registry|
    registry.gsub!(/<\/*registrationList>/, "")

    Can someone help me understand what's going on here?

    Thanks,
    Peter
    --
    Posted via http://www.ruby-forum.com/.
     
    Peter Bailey, Sep 21, 2007
    #1
    1. Advertising

  2. Peter Bailey wrote:
    > Here's the lines where this starts:
    > registries = []
    > registries = xmlfile.scan(/<registration>(.*? )<\/registration>/im)
    > #puts registries[100]
    >
    > registries.sort!
    > registries.each do |registry|
    > registry.gsub!(/<\/*registrationList>/, "")
    >
    > Can someone help me understand what's going on here?


    If you have capturing groups in your regexp, scan will return an array of
    arrays, so you are indeed calling gsub! on the subarrays. So either iterate
    over registries.flatten or call gsub! on registry[0] instead of registry.


    HTH,
    Sebastian
    --
    Jabber:
    ICQ: 205544826
     
    Sebastian Hungerecker, Sep 21, 2007
    #2
    1. Advertising

  3. Peter Bailey

    Peter Bailey Guest

    Sebastian Hungerecker wrote:
    > Peter Bailey wrote:
    >> Here's the lines where this starts:
    >> registries = []
    >> registries = xmlfile.scan(/<registration>(.*? )<\/registration>/im)
    >> #puts registries[100]
    >>
    >> registries.sort!
    >> registries.each do |registry|
    >> registry.gsub!(/<\/*registrationList>/, "")
    >>
    >> Can someone help me understand what's going on here?

    >
    > If you have capturing groups in your regexp, scan will return an array
    > of
    > arrays, so you are indeed calling gsub! on the subarrays. So either
    > iterate
    > over registries.flatten or call gsub! on registry[0] instead of
    > registry.
    >
    >
    > HTH,
    > Sebastian


    Thanks, Sebastian. OK, I did a .flatten, which I read more about and
    looks like a very cool method. Now, I don't get an error message, but, I
    don't get any substitutions either! You suggest doing a gsub! on
    registry[0], but, that's just the first entry. What about the hundreds
    more I need to work on?

    I need to keep the sub-groups discrete, because, I'm going to need to
    sort them, again, based on criteria at the bottom of each group.

    -Peter
    --
    Posted via http://www.ruby-forum.com/.
     
    Peter Bailey, Sep 21, 2007
    #3
  4. Peter Bailey wrote:
    > > Peter Bailey wrote:
    > >> registries.sort!
    > >> registries.each do |registry|
    > >> registry.gsub!(/<\/*registrationList>/, "")

    >
    > Thanks, Sebastian. OK, I did a .flatten, which I read more about and
    > looks like a very cool method. Now, I don't get an error message, but, I
    > don't get any substitutions either!


    Yes, I didn't notice this the first time because I was only focussing on the
    error you were getting, but the gsub! is basically useless there. You're
    using it to modify registry which is thrown away at the end of the iteration.
    each doesn't modify the array over which it iterates for that you want map:
    registries.map! do |registry|
    registry.gsub(/<\/*registrationList>/, "")
    end
    (This assumes that registries is already flattened, otherwise use registry[0]
    instead of registry. Thinking about it that might actually be better because
    it saves you the flatten step)

    > You suggest doing a gsub! on
    > registry[0], but, that's just the first entry.


    registry only ever has one entry because the scan regex has only one capturing
    group.


    HTH,
    Sebastian
    --
    Jabber:
    ICQ: 205544826
     
    Sebastian Hungerecker, Sep 21, 2007
    #4
  5. Peter Bailey

    Phrogz Guest

    > registries = []
    > registries = xmlfile.scan(/<registration>(.*? )<\/registration>/im)
    > #puts registries[100]
    >
    > registries.sort!
    > registries.each do |registry|
    > registry.gsub!(/<\/*registrationList>/, "")


    regmatch = /<registration>(.*? )<\/registration>/im

    # method one
    registries = []
    xmlfile.scan( regmatch ) do |registry|
    registries << registry.gsub %r{</?registrationList>}, ''
    end
    registries.sort!

    # method two
    registries = xmlfile.scan( regmatch ).flatten.map do |reg|
    reg.gsub %r{</?registrationList>}, ''
    end.sort
     
    Phrogz, Sep 21, 2007
    #5
    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. Kevin Spencer

    Re: VS thinks it knows things better

    Kevin Spencer, Jun 27, 2003, in forum: ASP .Net
    Replies:
    0
    Views:
    406
    Kevin Spencer
    Jun 27, 2003
  2. Charlie Nilsson [MSFT]

    RE: VS thinks it knows things better

    Charlie Nilsson [MSFT], Jun 27, 2003, in forum: ASP .Net
    Replies:
    2
    Views:
    437
    Martin Olson
    Jun 30, 2003
  3. =?Utf-8?B?UHJhYmFrYXIgU2FtaXlhcHBhbg==?=

    Thinks to be followed while working in asp.net in V2005

    =?Utf-8?B?UHJhYmFrYXIgU2FtaXlhcHBhbg==?=, Nov 3, 2006, in forum: ASP .Net
    Replies:
    1
    Views:
    287
    Karl Seguin [MVP]
    Nov 3, 2006
  4. aurelianito

    gsub and gsub! are inconsistent

    aurelianito, Nov 8, 2005, in forum: Ruby
    Replies:
    9
    Views:
    165
    Robert Klemme
    Nov 9, 2005
  5. Ryan Smith
    Replies:
    11
    Views:
    245
    Ryan Smith
    Jan 29, 2010
Loading...

Share This Page