2010-09-19 9 views
5

Citando Perl::Critic::Policy::InputOutput::ProhibitExplicitStdin¿Por qué debería usar <ARGV> o <> en lugar de <STDIN> en Perl?

Perl tiene un gestor de archivo magia útil llamada * ARGV que comprueba la línea de comandos y si hay argumentos, se abre y lee los archivos como. Si no hay argumentos, * ARGV se comporta como * STDIN en su lugar. Este comportamiento es casi siempre lo que desea si desea crear un programa que lea de STDIN. Esto a menudo se escribe en una de las dos formas equivalentes siguientes:

while (<ARGV>) { 
    # ... do something with each input line ... 
} 
# or, equivalently: 
while (<>) { 
    # ... do something with each input line ... 
} 
  • ¿Es "sólo una convención" o hay algunas razones de peso para no usar <STDIN>?

me siento <STDIN> hace que las intenciones de mi código más claro que el uso de <> o <ARGV>.

El flujo de mi código es como esto

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

... 

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

Respuesta

5

Es porque el uso de <ARGV> permitirá a los usuarios especificar los archivos para leer de como argumentos, o cosas por el tubo en la entrada estándar mientras especifica ningún argumento. Si usa <STDIN>, solo funcionará la tubería.

Por supuesto, depende de usted decidir si cree que la gente le gustaría poder especificar archivos como argumentos de línea de comandos, pero es algo que muchos programas respaldan, por lo que vale la pena pensar en ello.

+0

Gracias. Si esta es la única razón, entonces siento que '' es mejor. – Lazer

+1

@Lazer: no es "mejor", impone restricciones sobre las formas en que puede usar el programa. ¿Por qué hacer eso innecesariamente? – Ether

+0

Perl :: Critic se basa en el libro "Mejores prácticas de Perl", que simplemente dice: "Evita usar * STDIN, a menos que realmente lo digas". La justificación dada es una versión más larga de la respuesta anterior. Si realmente quiere decir que solo STDIN lo hará, no se aceptan argumentos de línea de comando, entonces use STDIN explícito. – jmanning2k

6

Utiliza la que hace lo que quieres hacer. Consulte perlvar para obtener una explicación del identificador de archivo ARGV. ARGV también lee de los nombres de archivo que especifiques en la línea de comando. Tal vez quieras esa característica, tal vez no.

Y no tiene que hacer lo que dice Perl :: Critic. Muchas de esas políticas son opiniones de un pequeño grupo de personas. Si solo quiere leer de STDIN explícitamente, eso es lo que debe hacer. Las personas que escriben las políticas de Crítica no están allí para indicar lo que debe hacer. Hacer cualquier pregunta como esta no tiene ningún sentido sin el contexto de su aplicación. Las reglas generales son meramente generales y se rompen cuando se habla de casos específicos.

No estoy seguro de por qué cree que su intención es más clara con STDIN porque no nos dijo su intención. El código casi nunca habla por sí mismo porque tendemos a codificar la solución en lugar de plantear el problema. La solución podría no ser la correcta.

En su caso, creo que este código es más claro porque está escrito en Perl en vez del dialecto de C que está utilizando :)

chomp(my $length = <STDIN>); 

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

    my @temp = split ' '; 
    ...; 
    } 
Cuestiones relacionadas