Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > array.each puzzle from new ruby-er

Reply
Thread Tools

array.each puzzle from new ruby-er

 
 
Gani Ruthellen
Guest
Posts: n/a
 
      08-07-2007
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
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Dan Zwell
Guest
Posts: n/a
 
      08-07-2007
Gani Ruthellen wrote:
> 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

 
Reply With Quote
 
 
 
 
Gani Ruthellen
Guest
Posts: n/a
 
      08-07-2007
> 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
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Noah Easterly
Guest
Posts: n/a
 
      08-07-2007
On Aug 7, 2:04 pm, Gani Ruthellen <(E-Mail Removed)> wrote:
> > 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
> --
> Posted viahttp://www.ruby-forum.com/.


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

 
Reply With Quote
 
Dan Zwell
Guest
Posts: n/a
 
      08-07-2007
Gani Ruthellen wrote:
>> 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

 
Reply With Quote
 
Gani Ruthellen
Guest
Posts: n/a
 
      08-07-2007
Noah Easterly wrote:
> On Aug 7, 2:04 pm, Gani Ruthellen <(E-Mail Removed)> wrote:
>> > end

>> Posted viahttp://www.ruby-forum.com/.

> 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


--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
dima
Guest
Posts: n/a
 
      08-07-2007
On Aug 7, 9:10 pm, Gani Ruthellen <(E-Mail Removed)> wrote:
> Noah Easterly wrote:
> > On Aug 7, 2:04 pm, Gani Ruthellen <(E-Mail Removed)> wrote:
> >> > end
> >> Posted viahttp://www.ruby-forum.com/.

> > 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
>
> --
> Posted viahttp://www.ruby-forum.com/.


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

 
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
new cpp puzzle group.. doublemaster007@gmail.com C++ 0 11-24-2008 08:44 AM
Javascript new-new-new-new-newbee weblinkunlimited@gmail.com Javascript 2 03-11-2008 01:15 AM
Puzzle: make new compilers understand what g++ 2.95.3 compiled nospam_news@wanano.net C++ 5 05-08-2007 09:39 PM
Puzzle: make new compilers understand what g++ 2.95.3 compiled nospam_news@wanano.net C++ 2 05-08-2007 12:06 PM
A puzzle to puzzle you sk A+ Certification 1 07-17-2004 05:19 PM



Advertisments