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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top