[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

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

Peter Bailey

9/21/2007 2:39:00 PM

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-....

4 Answers

Sebastian Hungerecker

9/21/2007 2:49:00 PM

0

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: sepp2k@jabber.org
ICQ: 205544826

Peter Bailey

9/21/2007 3:11:00 PM

0

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-....

Sebastian Hungerecker

9/21/2007 4:04:00 PM

0

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: sepp2k@jabber.org
ICQ: 205544826

Phrogz

9/21/2007 7:45:00 PM

0

> 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