Come convertire i contenuti stdin un array?
Domanda
Ho un INPUT file che ha il seguente contenuto:
123\n
456\n
789
Voglio correre il mio script in questo modo: script.rb
myArray = STDIN.to_s
myArray.split(/\n/)
puts field.size
Mi aspetto questo per stampare 3, ma sto ottenendo 15. Sono molto confuso qui. Eventuali puntatori?
Soluzione
Si desidera
myArray = $stdin.readlines
Che sarà ottenere tutti $ stdin in una matrice con una sola voce di allineamento per ogni linea di ingresso.
Si noti che questo è spettacolarmente inefficiente (memoria saggio) con grandi file di input, così sei molto meglio usare qualcosa di simile:
$stdin.each_line do |l|
...
end
anziché
a = $stdin.readlines
a.each do |l|
...
end
Perché il primo non allocare memoria per tutto up-front. Prova l'elaborazione di un file di log multi-gigabyte al secondo modo per vedere quanto la buona prestazione di swap del sistema è ...
Altri suggerimenti
Che cosa il vostro sono dopo è con $stdin
invece di $ stdin.to_s
ruby -e 'p $stdin.readlines.size' < INPUT
3
ruby -e 'p $stdin.to_s'
"#<IO:0x7fc7cc578af0>"
STDIN.lines è pigro, ma ti dà una struttura a matrice simile a passare in giro e iterare.