8

我有一个包含以下内容的文件 INPUT:

123\n
456\n
789

我想像这样运行我的脚本:script.rb < INPUT 并让它将 INPUT 文件的内容转换为数组,在换行符上拆分。所以,我有类似 myArray = [123,456,789] 的东西。这是我尝试做的事情,但运气不佳:

myArray = STDIN.to_s
myArray.split(/\n/)
puts field.size

我希望这会打印 3,但我得到了 15。我在这里真的很困惑。任何指针?

4

3 回答 3

21

你要

myArray = $stdin.readlines

这会将所有 $stdin 放入一个数组中,每行输入一个数组条目。

请注意,对于大型输入文件,这是非常低效的(内存方面),所以你最好使用类似的东西:

$stdin.each_line do |l|
  ...
end

代替

a = $stdin.readlines
a.each do |l|
  ...
end

因为前者不会预先为所有内容分配内存。尝试以第二种方式处理数 GB 的日志文件,以查看系统的交换性能有多好... <grin>

于 2009-02-14T04:55:51.107 回答
1

你所追求的是使用 $stdin而不是 $stdin.to_s

ruby -e 'p $stdin.readlines.size' < INPUT
3

ruby -e 'p $stdin.to_s'
"#<IO:0x7fc7cc578af0>"
于 2009-02-14T03:53:04.720 回答
1

STDIN.lines 是惰性的,但为您提供了一个类似数组的结构来传递和迭代。

于 2009-02-14T09:13:38.787 回答