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

P

Peter Bailey

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
 
S

Sebastian Hungerecker

Peter said:
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
 
P

Peter Bailey

Sebastian said:
Peter said:
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
 
S

Sebastian Hungerecker

Peter said:
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
 
P

Phrogz

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,968
Messages
2,570,154
Members
46,702
Latest member
LukasConde

Latest Threads

Top