¿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"
lamcro
fuente
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.

usuario44511
fuente
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í .

George Stocker
fuente
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.

nrich
fuente
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.

rastin71
fuente
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:

Joao Costa
fuente
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í

pkm
fuente
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).

Dave Sherohman
fuente
5
my $output_file;

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

{

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


}
usuario3331697
fuente
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 .

Bagazo
fuente