Pregunta

Tengo una entrada de archivo que tiene el siguiente contenido:

123\n
456\n
789

Quiero correr mi script de este modo: script.rb

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

Estoy esperando esta opción para imprimir 3, pero yo estoy 15. Estoy muy confundido aquí. Cualquier punteros?

¿Fue útil?

Solución

¿Quieres

myArray = $stdin.readlines

que ponerlas todas $ entrada estándar en una matriz con una sola entrada de la matriz por cada línea de entrada.

Tenga en cuenta que esto es espectacularmente ineficaz (memoria del reloj) con grandes archivos de entrada, por lo que está mucho mejor usar algo como:

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

en lugar de

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

Debido a que el primero no asignar memoria para todo por adelantado. Intentará procesar un archivo de registro de varios gigabytes la segunda manera de ver lo bien que el rendimiento de intercambio de su sistema es ...

Otros consejos

Lo que buscamos es su usando $stdin en lugar de $ stdin.to_s

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

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

STDIN.lines es perezoso, pero le da una estructura de tipo array para pasar alrededor y iterar sobre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top