¿Cómo puedo pasar argumentos de línea de comandos a un programa Perl?


137

Estoy trabajando en un script de Perl. ¿Cómo puedo pasarle los parámetros de la línea de comando?

Ejemplo:

script.pl "string1" "string2"

3
Bueno, en primer lugar, vas a necesitar que sea así ./script.plo pasará mucho tiempo en el tiempo de ejecución.
Parthian Shot

Respuestas:


189

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

Si tienen un significado diferente, puede usarlos GetOpt::Stdy GetOpt::Longprocesarlos fácilmente. GetOpt::Stdsolo admite conmutadores de un solo carácter y GetOpt::Longes 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, @ARGVes una variable especial que contiene todos los argumentos de la 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 @ARGV.


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

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


60

Los pasa como está pensando, y en su secuencia de comandos, los obtiene de la matriz @ARGV. Al igual que:

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

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

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

}

A partir de aquí .


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

10
En lugar de $#ARGV + 1usted también podría haber dicho@ARGV
Leon Timmermans,

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

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

imprimirá cada argumento.


Si no usa getopts, así es como recomendaría recorrer una lista de argumentos de manera no destructiva. Basado en perlmeme.org/howtos/syntax/foreach.html parece que la sintaxis es correcta; para una advertencia, consulte la sección, Efectos secundarios: la variable de control es un alias para el elemento de la lista
jaredor

24

Alternativamente, una manera más sexy y placentera .....

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

"Asume" se pasan dos valores. Un código adicional puede verificar que la suposición sea segura.


66
No estoy seguro de cómo se trata esta información nueva, pero decidí no votar en contra, ya que eres nuevo.
Joel Berger el

No es más sexy. Todos los argumentos están disponibles @ARGVsin ninguna acción suya, al igual que C / C ++ los proporciona a través de argv / argc
Eugen Konkov

21

Otra opción más es usar perl -s, por ejemplo:

#!/usr/bin/perl -s

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

Entonces llámalo así:

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

O vea el artículo original para más detalles:


13

Puede acceder a ellos directamente, asignando la variable especial @ARGVa 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

ingrese la descripción de la imagen aquí


7

Si los argumentos son nombres de archivo para leer, use el operador de diamante (<>) para obtener su contenido:

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

Si los argumentos son opciones / modificadores, use GetOpt :: Std o GetOpt :: Long, como ya se muestra en slavy13.myopenid.com.

En el caso de que sean algo más, puede acceder a ellos ya sea caminando explícitamente a través de @ARGV o con el shiftcomando:

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

(Tenga en cuenta que hacer esto con shiftsolo funcionará si está fuera de todo subs. Dentro de a sub, recuperará la lista de argumentos pasados ​​al programa en sublugar de los pasados ​​al programa).


5
my $output_file;

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

{

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


}

2

Si solo desea algunos valores, puede usar la matriz @ARGV. Pero si está buscando algo más poderoso para procesar algunas opciones de línea de comandos, debe usar Getopt :: Long .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.