2008-12-12 12 views

Respuesta

172

Depende de lo que quieras hacer. Si desea utilizar los dos argumentos como archivos de entrada, puede pasarlos y luego usar <> para leer sus contenidos.

Si tienen un significado diferente, puede usar GetOpt::Std y GetOpt::Long para procesarlos fácilmente. GetOpt::Std solo admite conmutadores de un solo carácter y GetOpt::Long es mucho más flexible. De GetOpt::Long:

use Getopt::Long; 
my $data = "file.dat"; 
my $length = 24; 
my $verbose; 
$result = GetOptions ("length=i" => \$length, # numeric 
        "file=s" => \$data,  # string 
        "verbose" => \$verbose); # flag 

Alternativamente, @ARGV es una variable especial que contiene todos los argumentos de línea de comandos. $ARGV[0] es el primero (es decir, "string1" en su caso) y $ARGV[1] es el segundo argumento. No necesita un módulo especial para acceder al @ARGV.

+27

$ ARGV [0] es el primer argumento; perl cuenta desde 0, y el nombre del programa está en $ 0 no @ARGV. – derobert

+4

a pesar de la confusión $ ARGV [0] .. este es el tipo de respuesta que espero encontrar, cuando busco SO, gracias y +1 de mi parte. – lexu

+0

variable $ ARGV es lo que usaré entonces. Gracias. – lamcro

56

Se pasa en al igual que lo está pensando, y en su escritura, que los reciba de la matriz @ARGV. De esta manera:

my $numArgs = $#ARGV + 1; 
print "thanks, you gave me $numArgs command-line arguments.\n"; 

foreach my $argnum (0 .. $#ARGV) { 

    print "$ARGV[$argnum]\n"; 

} 

De here.

+7

También vale la pena señalar que en algunos lenguajes de programación, el primer argumento (0) es el comando o la secuencia de comandos en sí ... aunque no en perl, por supuesto. – danieltalsky

+9

En lugar de '$ # ARGV + 1' también podría haber dicho' @ ARGV' –

+0

simplemente use 'ARGV [0]' o '$ argv [1]' si está buscando un argumento particular. – Manoj

27
foreach my $arg (@ARGV) { 
    print $arg, "\n"; 
} 

imprimirá cada argumento.

+0

Si no utiliza getopts, así es como recomendaría recorrer de forma no destructiva una lista de argumentos. Basado en http://www.perlmeme.org/howtos/syntax/foreach.html parece que la sintaxis es correcta; para una advertencia, consulte la sección, _Side-effects: la variable de control es un alias del elemento de lista_ – jaredor

7

Si los argumentos son los nombres de archivo para ser leídos desde, utilice el diamante (<>) del operador para llegar a su contenido:

while (my $line = <>) { 
    process_line($line); 
} 

Si los argumentos son opciones/interruptores, utilizar Getopt :: Std o Getopt :: Long, como ya se mostró en slavy13.myopenid.com.

En la remota posibilidad de que son algo más, se puede acceder a ellos, ya sea caminando a través de @ARGV explícita o con el comando shift:

while (my $arg = shift) { 
    print "Found argument $arg\n"; 
} 

(Tenga en cuenta que haciendo esto con shift sólo funcionará si se encuentra fuera de todos los sub s. Dentro de un sub, se recuperará la lista de argumentos pasados ​​a la sub en lugar de los aprobados para el programa.)

2

Si sólo quieres algunos valores, sólo puede utilizar el @ARGV formación. Pero si busca algo más poderoso para hacer algún procesamiento de opciones de línea de comandos, debe usar Getopt::Long.

23

Como alternativa, una forma más atractiva perlish .....

my ($src, $dest) = @ARGV;

"supone" se pasan dos valores. El código adicional puede verificar que la suposición es segura.

+6

No estoy seguro de cómo esta es la información nueva, pero decidí contra un voto negativo, ya que eres nuevo. –

+0

No es más sexy. Todos los ** argumentos están disponibles a través de '@ ARGV' sin ninguna acción suya ** al igual que C/C++ los suministra a través de argv/argc –

19

Sin embargo, otro opciones es usar Perl -s, por ejemplo:

#!/usr/bin/perl -s 

print "value of -x: $x\n"; 
print "value of -name: $name\n"; 

A continuación, llame así:

% ./myprog -x -name=Jeff 
value of -x: 1 
value of -name: Jeff 

O ver the original article para más detalles:

+0

¡Muy bueno y sencillo! –

13

Puede acceder directamente, asignando la variable especial @ARGV a una lista de variables. Así, por ejemplo:

($st, $prod, $ar, $file, $chart, $e, $max, $flag ,$id) = @ARGV; 

Perl tmp.pl 1 2 3 4 5

enter image description here

+0

¿Y cómo se usa? –

+0

revise el comentario actualizado, solo tiene que pasar del espacio de línea de comando separado – pkm

5
my $output_file; 

if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i")) 

{ 

$output_file= chomp($ARGV[1]) ; 


} 
+2

Proporcione más detalles sobre su código –

Cuestiones relacionadas