Dear all, I’m a newbie to ruby and today when I’m writing a simple
script to process some data, I found something I can’t understand.
The data is stored in several column seperated by tab or space. I use
the following code to get the data (assuming the data comes from
standard input and all numbers are integer)
data=[]
counter = 0
while line = STDIN.gets
data[counter] = line.split
data[counter].map! {|str| str.to_i}
counter += 1
end
hence data[i] is an array hold all the numbers in the ith line, data[i]
[j] is the number on ith line and jth column. Then what I want the
script to do is sorting lines according to a specified column. I
thought the following code should work:
result = data.sort {|x, y| x[col] <=> y[col] }
where the col determine which column the script will sort according
to. However ruby raise a error saying:
"undefined method <=>' for nil:NilClass (NoMethodError) from ana.rb:16:insort’
from ana.rb:16
"
I have to write the code as
result = data.sort {|x, y| x[col].to_i <=> y[col].to_i }
to let the script run properly. I’m quite confused here. I think the
elements of array data are converted to integer when the code
data[counter].map! {|str| str.to_i}
finished. However why ruby still requires a explicit conversion when I
use the data.sort?
use the data.sort?
If you have an array arr with n elements which you all turn into
integers,
arr[i] with i>=n will still be nil. So if in your case not all rows have
more
than col columns, that would explain the problem.
Shouldn’t line 4 be presented with a double = (==) since you’re trying
do something while line == STDIN.gets?
No, the assignment of line = STDIN.gets happens first which reads up to
a ‘\n’ including it. While then loops while this value is true.
When there is no more inmput, line will be assigned nothing which is
false and the loop ends.
This works identically to other languages like perl/python/php