Как преобразовать содержимое STDIN в массив?

У меня есть файл ввода, который имеет следующее содержимое:

123n
456n
789

Я хочу запустить свой скрипт следующим образом: script.rb

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

Я ожидаю, что это напечатает 3, но я получаю 15. Я действительно запутался. Любой указатели?

3 ответов


вы хотите

myArray = $stdin.readlines

Это получит все $stdin в массив с одной записью массива на строку ввода.

обратите внимание, что это эффектно неэффективно (с памятью) с большими входными файлами, поэтому вам гораздо лучше использовать что-то вроде:

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

вместо

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

потому что первый не выделяет память для всего вперед. Попробуйте обработать файл журнала с несколькими гигабайтами вторым способом, чтобы узнать, насколько хороша ваша система производительность свопа есть...


все, что после используя $stdin вместо $stdin.to_s

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

ruby -e 'p $stdin.to_s'
"#<IO:0x7fc7cc578af0>"

STDIN.линии ленивы,но дают вам структуру, подобную массиву, для передачи и итерации.