2009-02-14 2 views
7

У меня есть входной файл, который имеет следующее содержание:Как преобразовать содержимое STDIN в массив?

123\n 
456\n 
789 

Я хочу, чтобы запустить мой сценарий так: script.rb < ВХОД и он преобразует содержимое входного файла в массив, разделение на новый символ линии. Итак, у меня будет что-то вроде myArray = [123,456,789]. Вот что я пытался сделать, и я не много удачи:

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

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

+0

oy vey. В третьей строке на самом деле говорится, что myArray.size. Типо в вопросе, а не код. – miketaylr

+0

@Mike: Редактируйте вопрос ... – womble

ответ

20

Вы хотите

myArray = $stdin.readlines 

Это будет получить все $ стандартного ввода в массив с вхождением один массив на строку ввода.

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

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

вместо

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

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

1

Что вы приехали после того, с помощью$stdin вместо $ stdin.to_s

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

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

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

Смежные вопросы