Como converter conteúdos STDIN para uma matriz?
Pergunta
Eu tenho um arquivo de entrada que tem o seguinte conteúdo:
123\n
456\n
789
Eu quero correr o meu script assim: script.rb
myArray = STDIN.to_s
myArray.split(/\n/)
puts field.size
Eu estou esperando isso para imprimir 3, mas estou ficando 15. Estou muito confuso aqui. Os ponteiros?
Solução
Você quer
myArray = $stdin.readlines
Isso vai começar tudo de $ stdin em uma matriz com uma entrada de matriz por linha de entrada.
Note que este é espetacularmente ineficiente (memória sábio) com grandes arquivos de entrada, assim que você é muito melhor fora de usar algo como:
$stdin.each_line do |l|
...
end
em vez de
a = $stdin.readlines
a.each do |l|
...
end
Não porque o ex-faz alocar memória para tudo up-front. Experimente o processamento de um arquivo de log multi-gigabyte a segunda maneira de ver o quão bom desempenho de swap do sistema é ...
Outras dicas
O que o seu está depois é usando $stdin
vez de US $ stdin.to_s
ruby -e 'p $stdin.readlines.size' < INPUT
3
ruby -e 'p $stdin.to_s'
"#<IO:0x7fc7cc578af0>"
STDIN.lines é preguiçoso, mas dá-lhe um array-como estrutura para passar ao redor e interagir sobre.