325 votes

Meilleures pratiques avec STDIN en Ruby ?

Je veux faire face à l’entrée de la ligne de commande en Ruby :

Quelle est la meilleure façon de le faire ? En particulier je veux traiter STDIN vide, et j’espère que pour une solution élégante.

424voto

Jonke Points 4350

Ce sont juste des choses que j'ai trouvé dans ma collection d'obscurs Ruby.

Donc, en Ruby, un simple non-cloches de la mise en œuvre de la commande Unix cat serait:

#!/usr/bin/env ruby
puts ARGF.read

ARGF est votre ami quand il s'agit de l'entrée; c'est un fichier virtuel qui obtient toutes les entrées dans les fichiers nommés ou tous à partir de STDIN.

ARGF.each_with_index do |line, idx|
    print ARGF.filename, ":", idx, ";", line
end

# print all the lines in every file passed via command line that contains login
ARGF.each do |line|
    puts line if line =~ /login/
end

Dieu merci, nous n'avons pas le diamant de l'opérateur en Ruby, mais nous avons obtenu ARGF comme un remplacement. Si obscures, il s'avère être utile. Considérons ce programme, qui ajoute le droit d'auteur en-têtes en place (grâce à un autre Perlism, -i) de tous les fichiers mentionnés sur la ligne de commande:

#!/usr/bin/env ruby -i

Header = DATA.read

ARGF.each_line do |e|
  puts Header if ARGF.pos - e.length == 0
  puts e
end

__END__
#--
# Copyright (C) 2007 Fancypants, Inc.
#++

Crédit:

44voto

Bill Caputo Points 221

Ruby fournit une autre façon de gérer le STDIN : le drapeau - n. Il traite votre programme entier comme étant à l’intérieur d’une boucle sur STDIN, (y compris les fichiers passés en ligne de commande args). Voir par exemple le script 1-ligne suivant :

34voto

Damir Zekić Points 7517

Je ne suis pas sûr de ce dont vous avez besoin, mais je voudrais utiliser quelque chose comme ceci :

Notez que parce que le tableau ARGV est vide avant le premier `` , Ruby n’essaierai pas d’interpréter l’argument en tant que fichier texte permettant de lire (comportement hérité de Perl).

Si stdin est vide ou il n’y a pas d’arguments, rien n’est imprimé.

Quelques cas de test :

20voto

Magnus Holm Points 1041

Quelque chose comme ceci peut-être ?

Exemple :

13voto

texasbruce Points 5321
<pre><code></code><p>Il s’inspire de Perl :</p><pre><code></code></pre></pre>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X