7
votes

Script à courir contre STDIN si aucun argument; Sinon, fichier d'entrée = argv [0]

Cela fonctionne assez bien - il suffit de vous demander s'il y a des améliorations à raccourcir?

if (ARGV[0].nil?) then
    input=$<
else
    input=File.new(ARGV[0],"r");
end

...
# Do something with the input here, for example:
input.each_line do |line|
    puts line
end


0 commentaires

3 Réponses :


2
votes

alors code> et ; code> sont également facultatifs

Vous pouvez également utiliser l'opérateur ternaire: P>

input = ARGV[0].nil? ? $< : File.new(ARGV[0],"r")


1 commentaires

Super - +1 - Mais j'ai voté l'autre réponse car elle est encore plus courte! Bon vieux rubis!



3
votes

Seulement argv? fonctionne pour moi, "r" normalement par défaut, donc pouvez le sauter, et fichier.new () peut être identique à fichier () , donc xxx


1 commentaires

Fichier ("FOO") ne semble plus fonctionner (Ruby 2.3.1): Nométhoderror: méthode non définie `fichier 'pour principal: objet.



18
votes

Vous pouvez éliminer les cinq premières lignes entièrement.

de Pickaxe P>

$ <: un objet qui donne acc la concat du contenu de tous les fichiers donn en ligne commande arguments ou stdin le cas o il n a pas d m similaires fichier: binmode fermer ferm chacun chacun_byte chaque_line eof fichier nom fileno getc obtient lineno chemin pos lecture readcar lireline readlines rewind cherchez sautez dites to_a to_i to_io to_s avec renvoie pour actuellement lu. cela peut changer comme lit via ligne. p> BlockQuote>

Par conséquent: P>

while s = gets
  puts s
end


3 commentaires

De plus, vous pouvez utiliser argf , car c'est un alias to $ << / code>.


Ouais - cela fonctionne bien - cela me fait me demander pourquoi je suis retourné dans des cercles la première fois pour attraper cela. Je pense que c'est peut-être à cause du comportement légèrement étrange (mais bon) que vous êtes en train de gérer «ruby myscript.rb» sans argument, que le script disparaît simplement - la plupart des programmes (certes sur Unix par exemple) s'asseoir et attendre STDIN: Je suppose donc que j'ai supposé que je devais mettre en œuvre quelque chose là-bas - mais en fait (merci pour la description), l'interprète Ruby fait quelque chose de très utile et assez intelligent (comme d'habitude) là-bas! Merci.


Je suis juste là avec toi. Je m'habitue toujours à (et à découvrir) toutes ces petites astuces de rubis.