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"
lamcro
la source
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.

user44511
la source
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 .

George Stocker
la source
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.

nrich
la source
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.

rastin71
la source
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:

Joao Costa
la source
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

pkm
la source
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.)

Dave Sherohman
la source
5
my $output_file;

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

{

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


}
user3331697
la source
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 .

Marc
la source