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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top