Comment convertir le contenu STDIN à un tableau?
Question
J'ai un fichier d'entrée qui a le contenu suivant:
123\n
456\n
789
Je veux courir mon script comme si: script.rb
myArray = STDIN.to_s
myArray.split(/\n/)
puts field.size
Je me attends à ce imprimer 3, mais je reçois 15. Je suis vraiment confus ici. Tous les pointeurs?
La solution
Vous voulez
myArray = $stdin.readlines
Ça va obtenir tous $ stdin dans un tableau avec une entrée de gamme par ligne d'entrée.
Notez que ceci est spectaculairement inefficace (mémoire sage) avec de gros fichiers d'entrée, de sorte que vous êtes beaucoup mieux d'utiliser quelque chose comme:
$stdin.each_line do |l|
...
end
au lieu de
a = $stdin.readlines
a.each do |l|
...
end
Parce que l'ancien n'alloue pas de mémoire pour tout à l'avance. Essayez le traitement d'un fichier journal multi-gigaoctet la deuxième façon de voir à quel point les performances de swap de votre système est ...
Autres conseils
Qu'est-ce que vous êtes après est avec $stdin
au lieu de stdin.to_s $
ruby -e 'p $stdin.readlines.size' < INPUT
3
ruby -e 'p $stdin.to_s'
"#<IO:0x7fc7cc578af0>"
STDIN.lines est paresseux, mais vous donne une structure semblable à un tableau pour passer autour et itérer.