Cómo convertir contenidos STDIN a una matriz?
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?
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.