Come posso passare gli argomenti della riga di comando a un programma Perl?


137

Sto lavorando a uno script Perl. Come posso passare i parametri della riga di comando ad esso?

Esempio:

script.pl "string1" "string2"

3
Bene, prima di tutto, avrai bisogno che ./script.placcada o che non succederà nulla di simile a venire.
Parthian Shot,

Risposte:


189

Dipende da cosa vuoi fare. Se si desidera utilizzare i due argomenti come file di input, è possibile passarli e utilizzarli<> per leggere il loro contenuto.

Se hanno un significato diverso, puoi usarli GetOpt::Stded GetOpt::Longelaborarli facilmente. GetOpt::Stdsupporta solo switch a carattere singolo ed GetOpt::Longè molto più flessibile. Da 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

In alternativa, @ARGVè una variabile speciale che contiene tutti gli argomenti della riga di comando. $ARGV[0]è il primo (cioè "string1"nel tuo caso) ed $ARGV[1]è il secondo argomento. Non è necessario un modulo speciale per accedere @ARGV.


29
$ ARGV [0] è il primo argomento; perl conta da 0 e il nome del programma è in $ 0 non @ARGV.
derobert,

4
nonostante la confusione di $ ARGV [0] .. questo è il tipo di risposta che spero di trovare, quando cerco SO, grazie e +1 da parte mia.
lexu,


60

Li passi proprio come stai pensando, e nella tua sceneggiatura li prendi dall'array @ARGV. Così:

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

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

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

}

Da qui .


8
Vale anche la pena notare che in alcuni linguaggi di programmazione il primo (0) argomento è il comando o lo script stesso ... non così in perl, ovviamente.
danieltalsky,

10
Invece di $#ARGV + 1te avresti potuto anche dire@ARGV
Leon Timmermans il

1
basta usare ARGV[0]o $argv[1]se stai cercando argomenti particolari.
Manoj,

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

stamperà ogni argomento.


Se non usi getopts, è così che consiglierei di attraversare in modo non distruttivo un elenco di argomenti. Basato su perlmeme.org/howtos/syntax/foreach.html sembra che la sintassi sia corretta; per un avvertimento, controlla la sezione, Effetti collaterali: la variabile di controllo è un alias dell'elemento elenco
jaredor

24

In alternativa, un modo perlish più sexy .....

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

"Presuppone" vengono passati due valori. Il codice aggiuntivo può verificare che il presupposto sia sicuro.


6
Non sono sicuro di come si tratti di nuove informazioni, ma ho deciso di non votare a fondo, dato che sei nuovo.
Joel Berger

Non è più sexy. Tutti gli argomenti sono disponibili @ARGVsenza alcuna azione da parte tua, proprio come C / C ++ li fornisce tramite argv / argc
Eugen Konkov

21

Un'altra opzione è usare perl -s, ad esempio:

#!/usr/bin/perl -s

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

Quindi chiamalo così:

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

Oppure vedi l'articolo originale per maggiori dettagli:


13

È possibile accedervi direttamente, assegnando la variabile speciale @ARGVa un elenco di variabili. Quindi, per esempio:

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

perl tmp.pl 1 2 3 4 5

inserisci qui la descrizione dell'immagine


7

Se gli argomenti sono nomi di file da cui leggere, utilizzare l'operatore diamond (<>) per ottenere il loro contenuto:

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

Se gli argomenti sono opzioni / opzioni, utilizzare GetOpt :: Std o GetOpt :: Long, come già mostrato da slavy13.myopenid.com.

Nel caso in cui siano qualcos'altro, puoi accedervi camminando attraverso @ARGV esplicitamente o con il shiftcomando:

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

(Si noti che farlo con shiftfunzionerà solo se si è al di fuori di tutte le subs. All'interno di a sub, verrà recuperato l'elenco degli argomenti passati al subpiuttosto che quelli passati al programma.)


5
my $output_file;

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

{

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


}

2

Se vuoi solo alcuni valori, puoi semplicemente usare l'array @ARGV. Ma se stai cercando qualcosa di più potente per eseguire alcune opzioni della riga di comando, dovresti usare Getopt :: Long .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.