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.