Appending to an array

Hi All,

I am having a rather weird problem with array manipulation.

I have a file with a load of text in it, and I have a line which looks
like:

vthread << File.new(pathname,
“r”).readlines().to_s().grep(/^foobar/).uniq()

the expression /^foobar/ is repeated throughout, but there are
differences. Now, I would assume there to be a new entry added to the
array each time grep returns a match. However, while the code does what I
want it to, doing a:

vthread.length()

returns “1”

Printing this single element to the screen does indeed yield the results,
but what I want it to do is to add the match each time into a new element
in the array.

Am I doing something silly?

Thank You All,

Thomas Adam

···

=====
“The Linux Weekend Mechanic” – http://linuxgazette.net
"TAG Editor" – http://linuxgazette.net


BT Yahoo! Broadband - Save £80 when you order online today. Hurry! Offer ends 21st December 2003. The way the internet was meant to be. http://uk.rd.yahoo.com/evt=21064/*http://btyahoo.yahoo.co.uk

Thomas Adam wrote:

vthread << File.new(pathname,
“r”).readlines().to_s().grep(/^foobar/).uniq()

The << operator for array only appends the single object given to the
end of the array–it does not concatenate one array onto another. What
you probably want is the += operator:

vthread += File.new(…).grep(/^foobar/).uniq()

(Assuming, of course, that vthread is an array.)

···


Jamis Buck
jgb3@email.byu.edu

ruby -h | ruby -e ‘a=;readlines.join.scan(/-(.)[e|Kk(\S*)|le.l(…)e|#!(\S*)/) {|r| a << r.compact.first };puts “\n>#{a.join(%q/ /)}<\n\n”’

Hi All,

I am having a rather weird problem with array manipulation.

I have a file with a load of text in it, and I have a line which looks
like:

vthread << File.new(pathname,
“r”).readlines().to_s().grep(/^foobar/).uniq()

Here uniq() returns an array and you are adding this single object of
class Array into vthread. You may want to use

vthread.concat File.new …

instead.

By the way, your example leaves an opened file behind until it is
garbage collected. While possibly being OK in your environment, in
general it is better not to leave opened files when you can easily have
them closed. You can use:

IO.readlines(pathname) instead of File.new(pathname,“r”).readlines or
do this

vthread.concat File.open(pathname,“r”) { |_io|
_io.readlines().to_s().grep(/^foobar/).uniq()
}

When block is done, file will be closed.

the expression /^foobar/ is repeated throughout, but there are
differences. Now, I would assume there to be a new entry added to the
array each time grep returns a match. However, while the code does
what I
want it to, doing a:

vthread.length()

returns “1”

Printing this single element to the screen does indeed yield the
results,
but what I want it to do is to add the match each time into a new
element
in the array.

Am I doing something silly?

Thank You All,

Thomas Adam

=====
“The Linux Weekend Mechanic” – http://linuxgazette.net
“TAG Editor” – http://linuxgazette.net


_
BT Yahoo! Broadband - Save £80 when you order online today. Hurry!
Offer ends 21st December 2003. The way the internet was meant to be.
http://uk.rd.yahoo.com/evt=21064/*http://btyahoo.yahoo.co.uk

Sincerely,
Gennady Bystritsky

···

On Dec 11, 2003, at 14:46, Thomas Adam wrote:

— Jamis Buck jgb3@email.byu.edu wrote:

Thomas Adam wrote:

vthread << File.new(pathname,
“r”).readlines().to_s().grep(/^foobar/).uniq()

The << operator for array only appends the single object given to the
end of the array–it does not concatenate one array onto another. What
you probably want is the += operator:

vthread += File.new(…).grep(/^foobar/).uniq()

(Assuming, of course, that vthread is an array.)

James,

Many thanks for that!! True genius. Solved it completely. I wonder why I
never thought of it myself :slight_smile:

kudos_Points++;

:slight_smile:

– Thomas Adam

···

=====
“The Linux Weekend Mechanic” – http://linuxgazette.net
“TAG Editor” – http://linuxgazette.net


BT Yahoo! Broadband - Save £80 when you order online today. Hurry! Offer ends 21st December 2003. The way the internet was meant to be. http://uk.rd.yahoo.com/evt=21064/*http://btyahoo.yahoo.co.uk

“Jamis Buck” jgb3@email.byu.edu schrieb im Newsbeitrag
news:3FD8F5A5.7040607@email.byu.edu…

Thomas Adam wrote:

vthread << File.new(pathname,
“r”).readlines().to_s().grep(/^foobar/).uniq()

The << operator for array only appends the single object given to the
end of the array–it does not concatenate one array onto another. What
you probably want is the += operator:

vthread += File.new(…).grep(/^foobar/).uniq()

Not good: this creates new arrays all the time. Also: File.readlines is
better since it closes the file automatically:

vthread.push *File.readlines(pathname).grep(/^foobar/).uniq()
or
vthread.concat File.readlines(pathname).grep(/^foobar/).uniq()

Kind regards

robert

The “p” method is awefully handy:

a =
b =
c = [1,2,3]
a << c
b += c
p a # => [[1, 2, 3]]
p b # => [1, 2, 3]

“puts a” and “puts b” both display the same thing:
1
2
3

Not very helpful :slight_smile:

···

On Fri, 12 Dec 2003, Thomas Adam wrote:

— Jamis Buck jgb3@email.byu.edu wrote:

Thomas Adam wrote:

vthread << File.new(pathname,
“r”).readlines().to_s().grep(/^foobar/).uniq()

The << operator for array only appends the single object given to the
end of the array–it does not concatenate one array onto another. What
you probably want is the += operator:

vthread += File.new(…).grep(/^foobar/).uniq()

(Assuming, of course, that vthread is an array.)

James,

Many thanks for that!! True genius. Solved it completely. I wonder why I
never thought of it myself :slight_smile:

kudos_Points++;

:slight_smile:

– Thomas Adam

=====
“The Linux Weekend Mechanic” – http://linuxgazette.net
“TAG Editor” – http://linuxgazette.net


BT Yahoo! Broadband - Save £80 when you order online today. Hurry! Offer ends 21st December 2003. The way the internet was meant to be. http://uk.rd.yahoo.com/evt=21064/*http://btyahoo.yahoo.co.uk

Derek Lewis

===================================================================
Java Web-Application Developer

  Email    : email@lewisd.com
  Cellular : 604.312.2846
  Website  : http://www.lewisd.com

“If you’ve got a 5000-line JSP page that has “all in one” support
for three input forms and four follow-up screens, all controlled
by “if” statements in scriptlets, well … please don’t show it
to me :-). Its almost dinner time, and I don’t want to lose my
appetite :-).”
- Craig R. McClanahan