Как преобразовать содержимое STDIN в массив? - PullRequest
7 голосов
/ 14 февраля 2009

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

123\n
456\n
789

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

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

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

Ответы [ 3 ]

21 голосов
/ 14 февраля 2009

Вы хотите

myArray = $stdin.readlines

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

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

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

вместо

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

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

1 голос
/ 14 февраля 2009

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

1 голос
/ 14 февраля 2009

После чего вы используете $stdin вместо $ stdin.to_s

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

ruby -e 'p $stdin.to_s'
"#<IO:0x7fc7cc578af0>"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...