2010-09-19 5 views
5

Je cite Perl::Critic::Policy::InputOutput::ProhibitExplicitStdinPourquoi devrais-je utiliser <ARGV> ou <> au lieu de <STDIN> dans Perl?

Perl a un descripteur de fichier magique utile appelé * ARGV qui vérifie la ligne de commande et s'il y a des arguments, ouvre et lit les fichiers comme. S'il n'y a pas d'arguments, * ARGV se comporte comme * STDIN à la place. Ce comportement est presque toujours ce que vous voulez si vous voulez créer un programme qui lit à partir de STDIN. Ceci est souvent écrit dans l'une des deux formes équivalentes suivantes:

while (<ARGV>) { 
    # ... do something with each input line ... 
} 
# or, equivalently: 
while (<>) { 
    # ... do something with each input line ... 
} 
  • Est-il « juste une convention » ou sont-il des raisons solides de ne pas utiliser <STDIN>?

Je me sens <STDIN> fait plus clair de mon code intentions que d'utiliser <> ou <ARGV>.

Le flux de mon code est comme celui-ci

my @inp = <STDIN>; 
my $len = $inp[0]; 

... 

for(my $i = 0; $i < ($len + 0); $i++) { 
    my @temp = split (' ', $inp[$i]); 
    ... 
} 

Répondre

5

C'est parce que l'utilisation <ARGV> permettra aux utilisateurs soit spécifier les fichiers à lire comme des arguments ou des trucs de tuyau dans stdin en spécifiant aucun argument. Si vous utilisez <STDIN>, seule la tuyauterie fonctionnera. Bien sûr, c'est à vous de décider si vous pensez que les gens aimeraient pouvoir spécifier les fichiers en tant qu'arguments de la ligne de commande, mais c'est quelque chose que beaucoup de programmes prennent en charge, donc cela pourrait être utile.

+0

Merci. Si c'est la seule raison, alors je pense que "" est meilleur. – Lazer

+1

@Lazer: ce n'est pas "mieux", c'est imposant des restrictions sur la façon dont vous pouvez utiliser le programme. Pourquoi le faire inutilement? – Ether

+0

Perl :: Critic est basé sur le livre "Perl Best Practices", qui stipule simplement: "Évitez d'utiliser * STDIN, à moins que vous ne le pensiez vraiment." La justification donnée est une version plus longue de la réponse ci-dessus. Si vous voulez vraiment dire que seul STDIN le fera, aucun argument de ligne de commande accepté - alors utilisez explicitement STDIN. – jmanning2k

6

Vous utilisez celui qui fait ce que vous voulez faire. Voir perlvar pour une explication du handle de fichier ARGV. ARGV lit également à partir des noms de fichiers que vous spécifiez sur la ligne de commande. Peut-être que vous voulez cette fonctionnalité, peut-être que vous ne le faites pas.

Et, vous n'avez pas à faire ce que Perl :: Critic dit. Beaucoup de ces politiques sont les opinions d'un petit groupe de personnes. Si vous voulez seulement lire STDIN explicitement, c'est ce que vous devez faire. Les personnes qui écrivent les politiques de critique ne sont pas là pour indiquer ce que vous devez faire. Poser une question comme celle-ci est la plupart du temps inutile sans le contexte de son application. Les règles générales sont simplement générales et se décomposent lorsque l'on parle de cas spécifiques. Je ne sais pas pourquoi vous pensez que votre intention est plus claire avec STDIN parce que vous ne nous avez pas dit votre intention. Le code ne parle presque jamais de lui-même parce que nous avons tendance à coder la solution au lieu d'énoncer le problème. La solution pourrait ne pas être la bonne.

Dans votre cas, je pense que ce code est plus clair car il est écrit en Perl au lieu du dialecte C que vous utilisez :)

chomp(my $length = <STDIN>); 

my $count = 0; 
while (<STDIN>) { 
    last if $count++ > $lines_to_read; 

    my @temp = split ' '; 
    ...; 
    } 
Questions connexes