2011-02-16 2 views

Respuesta

29

Además, me gustaría sugerir fuertemente el uso de la forma idiomática de los argumentos de línea de comandos de procesamiento en Perl, Getopt::Long módulo (y comenzar a usar parámetros con nombre y no basados ​​en posición de las unidades).

Realmente no te importa si tienes < 3 parámetros. Por lo general, le importa si tiene los parámetros a, by C presentes.

En cuanto al diseño de la interfaz de línea de comando, 3 parámetros tratan sobre dónde se encuentra el corte entre los parámetros de posición (cmd <arg1> <arg2>) y los parámetros nombrados en cualquier orden (cmd -arg1 <arg1> -arg2 <arg2>).

por lo que están mejor haciendo:

use Getopt::Long; 
my %args; 
GetOptions(\%args, 
      "arg1=s", 
      "arg2=s", 
      "arg3=s", 
) or die "Invalid arguments!"; 
die "Missing -arg1!" unless $args{arg1}; 
die "Missing -arg2!" unless $args{arg2}; 
die "Missing -arg3!" unless $args{arg3}; 
5

Sí, está bien. @ARGV contiene los argumentos de la línea de comandos y evalúa en contexto escalar su número.

(Aunque parece que quería decir @ARGV < 2 o < 1 de su mensaje de error.)

10

Otra forma común de hacer esto es utilizar die

die "Usage: $0 PATTERN [FILE...]\n" if @ARGV < 3; 

Puede obtener más ayuda en el @ARGV especial variable en su línea de comando:

perldoc -v @ARGV 
+0

Mi 'perldoc' no funciona de esa manera. – aschepler

+0

¿Qué versión de perl estás usando? O puede que necesite escapar '@' para su caparazón. Ver 'perldoc -h'. – toolic

-3

Puede comparar con $ # ARGV en lugar de la matriz @ARGV

if ($#ARGV < 3) { ... 
+2

Esto está mal. No hay un escalar '$ ARGV'. – Tim

+0

@Juan: No. Mire http://perldoc.perl.org/perlvar.html para conocer el significado de '$ ARGV'. – toolic

+0

No.'$ ARGV' es el nombre de archivo actual utilizado por' <> 'y no tiene relación directa con' @ ARGV'. Cualquier matriz, incluido '@ ARGV', se puede usar en un contexto escalar, donde significa la cantidad de elementos. – aschepler

1

Uso $ # ARGV para obtener el número total de argumentos pasados ​​a un script Perl, así:

if (@#ARGV < 4) 

que he usado antes y funcionó como se muestra en http://www.cyberciti.biz/faq/howto-pass-perl-command-line-arguments/.

Consulte la documentación original en http://perldoc.perl.org/perlvar.html, se establece que:

@ARGV

La matriz @ARGV contiene los argumentos de línea de comandos destinados a la secuencia de comandos. $ # ARGV generalmente es la cantidad de argumentos menos uno, porque $ ARGV [0] es el primer argumento, no el nombre del comando del programa. Ver $ 0 para el nombre del comando.

+1

Eso no está bien. 'escalar @ ARGV' es uno menos que la longitud del argv real * porque * Perl se ha tomado la molestia de eliminar el nombre del programa de la matriz que le presenta. '$ # ARGV' es responsable del nombre del programa dos veces. –

Cuestiones relacionadas