array.each puzzle from new ruby-er

G

Gani Ruthellen

Given:
lines = file.readlines("\x15") # don't ask :)
lines.each do |y|
y.chomp!("\x15")
y.sub!(/^\n/,"") #kill off the extra line feeds
if y =~ /^\*\*\*/ then
y = "<someTag>" + y + "</someTag>"
...
[ assume ends]
puts lines

my output for the affected elements is:
<someTag>
value of y</someTag>

How can I get the results to be
<someTag>value of y</someTag>

I've tried changing y to y.to_s; I still get the new line.

I'm sure this is obvious if you know what you're doing, but I'm stumped.
Can somebody give me a clue?

TIA if you take a moment to point me in the right direction.
Gani
 
D

Dan Zwell

Gani said:
Given:
lines = file.readlines("\x15") # don't ask :)
lines.each do |y|
y.chomp!("\x15")
y.sub!(/^\n/,"") #kill off the extra line feeds
I would think it better to just call y.chomp! here (with no argument).
if y =~ /^\*\*\*/ then
y = "<someTag>" + y + "</someTag>"
Know that this is actually rebinding the local variable y to point to a
new object, not modifying the old object. If your goal was to modify the
array "lines", you should change "lines.each" to "lines.map" and make
sure you end the block with a statement that returns the modified y.

perhaps:
lines.map do |y|
y = y.chomp("\x15").chomp
y = "<someTag>" + y + "</someTag>" if y =~ /^\*\*\*/
y
end


Dan
 
G

Gani Ruthellen

Know that this is actually rebinding the local variable y to point to a
new object, not modifying the old object. If your goal was to modify the
array "lines", you should change "lines.each" to "lines.map" and make
sure you end the block with a statement that returns the modified y.

perhaps:
lines.map do |y|
y = y.chomp("\x15").chomp
y = "<someTag>" + y + "</someTag>" if y =~ /^\*\*\*/
y
end


Dan

Sorry, actually doing each_with_index do |y,ind| (etc) and specifically
setting lines[ind] = y
but my original question remains: how do i make the "<tag>" + y leave
off the \n so the output is
<tag>text of y
Thanks again
 
N

Noah Easterly

Know that this is actually rebinding the local variable y to point to a
new object, not modifying the old object. If your goal was to modify the
array "lines", you should change "lines.each" to "lines.map" and make
sure you end the block with a statement that returns the modified y.
perhaps:
lines.map do |y|
y = y.chomp("\x15").chomp
y = "<someTag>" + y + "</someTag>" if y =~ /^\*\*\*/
y
end

Sorry, actually doing each_with_index do |y,ind| (etc) and specifically
setting lines[ind] = y
but my original question remains: how do i make the "<tag>" + y leave
off the \n so the output is
<tag>text of y
Thanks again

Have you considered switching to map?

As for debugging, I'd try tracking it down using p

lines = file.readlines("\x15").map do |line|
line.chomp!("\x15")
line.sub!(/^\n/, "")
line = "<someTag>" + line + "</someTag>" if line =~ /^\*{3}/
p [:line, line] # comment me out after debugging
line
end

p [:lines, lines] # comment me out after debugging

puts lines
 
D

Dan Zwell

Gani said:
Know that this is actually rebinding the local variable y to point to a
new object, not modifying the old object. If your goal was to modify the
array "lines", you should change "lines.each" to "lines.map" and make
sure you end the block with a statement that returns the modified y.

perhaps:
lines.map do |y|
y = y.chomp("\x15").chomp
y = "<someTag>" + y + "</someTag>" if y =~ /^\*\*\*/
y
end


Dan

Sorry, actually doing each_with_index do |y,ind| (etc) and specifically
setting lines[ind] = y
but my original question remains: how do i make the "<tag>" + y leave
off the \n so the output is
<tag>text of y
Thanks again

Sorry, I thought that would work but didn't test it. "y.lstrip" will do
what you want, but will also will strip leading whitespace, which might
not be okay. If not, "y[1..-1]" should suffice--this will return y from
the second character on.
y = y[1..-1] if y =~ /^\n/

Dan
 
G

Gani Ruthellen

Noah said:
Have you considered switching to map?

As for debugging, I'd try tracking it down using p

lines = file.readlines("\x15").map do |line|
line.chomp!("\x15")
line.sub!(/^\n/, "")
line = "<someTag>" + line + "</someTag>" if line =~ /^\*{3}/
p [:line, line] # comment me out after debugging
line
end

p [:lines, lines] # comment me out after debugging

puts lines

Oh. I did a subset of the p [:line, line] and it looks like i had some
\n and some \r\n occurring. I was just pulling the \r\n on my sub call
(wrote it as \n to simplify)because when I was looking at the original
with end of line showing they all showed as CRLF. Odd.
Much improved output, and another tool in my meager toolkit. Thanks so
much, Noah and all other repliers! I'll look at replacing the each with
map/collect now that I know about it. I do have the Pragmatic
programming book...
Cheers, Gani
 
D

dima

Noah said:
Have you considered switching to map?
As for debugging, I'd try tracking it down using p
lines = file.readlines("\x15").map do |line|
line.chomp!("\x15")
line.sub!(/^\n/, "")
line = "<someTag>" + line + "</someTag>" if line =~ /^\*{3}/
p [:line, line] # comment me out after debugging
line
end
p [:lines, lines] # comment me out after debugging
puts lines

Oh. I did a subset of the p [:line, line] and it looks like i had some
\n and some \r\n occurring. I was just pulling the \r\n on my sub call
(wrote it as \n to simplify)because when I was looking at the original
with end of line showing they all showed as CRLF. Odd.
Much improved output, and another tool in my meager toolkit. Thanks so
much, Noah and all other repliers! I'll look at replacing the each with
map/collect now that I know about it. I do have the Pragmatic
programming book...
Cheers, Gani

Piece of advice - concatenation in Ruby is very fast but you should
take the better way by using:
y = "<someTag>" << y << "</someTag>"
which is a little faster with same readability ;-)
 

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
474,432
Messages
2,571,680
Members
48,796
Latest member
Greg L.

Latest Threads

Top