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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top