Comment puis-je transmettre des arguments de ligne de commande à un programme Perl?


137

Je travaille sur un script Perl. Comment puis-je lui passer des paramètres de ligne de commande?

Exemple:

script.pl "string1" "string2"

3
Eh bien, tout d'abord, vous en aurez besoin, ./script.plsinon il ne se passera rien au moment de l'exécution.
Parthe Shot

Réponses:


189

Tout dépends de ce que tu veux faire. Si vous souhaitez utiliser les deux arguments comme fichiers d'entrée, vous pouvez simplement les transmettre puis utiliser<> pour lire leur contenu.

S'ils ont une signification différente, vous pouvez les utiliser GetOpt::Stdet GetOpt::Longles traiter facilement. GetOpt::Stdprend en charge uniquement les commutateurs à un seul caractère et GetOpt::Longest beaucoup plus 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

Il @ARGVexiste également une variable spéciale contenant tous les arguments de ligne de commande. $ARGV[0]est le premier (c'est-à-dire "string1"dans votre cas) et $ARGV[1]est le deuxième argument. Vous n'avez pas besoin d'un module spécial pour y accéder @ARGV.


29
$ ARGV [0] est le premier argument; perl compte à partir de 0 et le nom du programme est en $ 0 et non en @ARGV.
derobert

4
malgré la confusion $ ARGV [0] .. c'est le genre de réponse que j'espère trouver, quand je recherche SO, merci et +1 de ma part.
lexu


60

Vous les transmettez comme vous le pensez, et dans votre script, vous les récupérez du tableau @ARGV. Ainsi:

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

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

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

}

D' ici .


8
Il est également intéressant de noter que dans certains langages de programmation, le premier argument (0) est la commande ou le script lui-même ... ce n'est pas le cas en perl, bien sûr.
danieltalsky

10
Au lieu de $#ARGV + 1vous auriez pu aussi dire@ARGV
Leon Timmermans

1
utilisez simplement ARGV[0]ou $argv[1]si vous recherchez un argument particulier.
Manoj

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

affichera chaque argument.


Si vous n'utilisez pas getopts, c'est ainsi que je recommanderais de parcourir de manière non destructive une liste d'arguments. Basé sur perlmeme.org/howtos/syntax/foreach.html, il semble que la syntaxe est correcte; pour une mise en garde, consultez la section Effets secondaires: La variable de contrôle est un alias de l'élément de liste
jaredor

24

Alternativement, une manière perlish plus sexy .....

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

"Suppose" que deux valeurs sont transmises. Un code supplémentaire peut vérifier que l'hypothèse est sûre.


6
Je ne sais pas en quoi il s'agit de nouvelles informations, mais j'ai décidé de ne pas voter contre, car vous êtes nouveau.
Joel Berger

Ce n'est pas plus sexy. Tous les arguments sont disponibles @ARGVsans aucune action de votre part, tout comme C / C ++ les fournit via argv / argc
Eugen Konkov

21

Encore une autre option consiste à utiliser perl -s, par exemple:

#!/usr/bin/perl -s

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

Alors appelez-le comme ceci:

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

Ou consultez l'article original pour plus de détails:


13

Vous pouvez y accéder directement, en affectant la variable spéciale @ARGVà une liste de variables. Ainsi, par exemple:

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

perl tmp.pl 1 2 3 4 5

entrez la description de l'image ici


7

Si les arguments sont des noms de fichiers à lire, utilisez l'opérateur losange (<>) pour accéder à leur contenu:

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

Si les arguments sont des options / commutateurs, utilisez GetOpt :: Std ou GetOpt :: Long, comme déjà montré par slavy13.myopenid.com.

Si c'est quelque chose d'autre, vous pouvez y accéder en parcourant explicitement @ARGV ou avec la shiftcommande:

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

(Notez que faire cela avec shiftne fonctionnera que si vous êtes en dehors de tous les subs. Dans a sub, il récupérera la liste des arguments passés au subplutôt que ceux passés au programme.)


5
my $output_file;

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

{

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


}

2

Si vous voulez juste quelques valeurs, vous pouvez simplement utiliser le tableau @ARGV. Mais si vous cherchez quelque chose de plus puissant pour traiter les options de ligne de commande, vous devriez utiliser Getopt :: Long .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.