Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > gsub not working. Ruby thinks I'm in an array?

Reply
Thread Tools

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

 
 
Peter Bailey
Guest
Posts: n/a
 
      09-21-2007
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/.

 
Reply With Quote
 
 
 
 
Sebastian Hungerecker
Guest
Posts: n/a
 
      09-21-2007
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: http://www.velocityreviews.com/forums/(E-Mail Removed)
ICQ: 205544826

 
Reply With Quote
 
 
 
 
Peter Bailey
Guest
Posts: n/a
 
      09-21-2007
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/.

 
Reply With Quote
 
Sebastian Hungerecker
Guest
Posts: n/a
 
      09-21-2007
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: (E-Mail Removed)
ICQ: 205544826

 
Reply With Quote
 
Phrogz
Guest
Posts: n/a
 
      09-21-2007
> 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

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
gsub and gsub! are inconsistent aurelianito Ruby 9 11-09-2005 01:38 PM
Impact of digital photography craze on culture not yet known, one expert thinks it could mean ‘dark age’ Norman Digital Photography 35 10-21-2005 10:30 AM
ruby gsub! problem Kev Jackson Ruby 12 10-03-2005 01:49 PM
Anybody that thinks the D70 is not *fast*.. Phoenix Digital Photography 55 07-18-2004 02:11 AM
behaviour change of String#gsub(pattern) {|m| ... } for ruby 1.9/ruby2? David Garamond Ruby 2 11-21-2003 12:34 AM



Advertisments