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

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

Peter B. wrote:

Here’s the lines where this starts:
registries = []
registries = xmlfile.scan(/(.*? )</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

Sebastian H. wrote:

Peter B. wrote:

Here’s the lines where this starts:
registries = []
registries = xmlfile.scan(/(.*? )</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

registries = []
registries = xmlfile.scan(/(.*? )</registration>/im)
#puts registries[100]

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

regmatch = /(.*? )</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

Peter B. wrote:

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

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs