web-dev-qa-db-fra.com

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

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

Exemple:

script.pl "string1" "string2"
134
lamcro

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

S'ils ont une signification différente, vous pouvez utiliser _GetOpt::Std_ et _GetOpt::Long_ pour les traiter facilement. _GetOpt::Std_ ne prend en charge que les commutateurs à caractère unique et _GetOpt::Long_ est 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
_

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

187
user44511

Vous les transmettez exactement comme vous le pensez et, dans votre script, vous les récupérez dans le 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";

}

De ici .

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

imprimera chaque argument.

29
nrich

Sinon, une façon plus sexy perlish .....

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

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

24
rastin71

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";

Puis appelez ça comme ça:

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

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

20
Joao Costa

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

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

Perl tmp.pl 1 2 3 4 5

enter image description here

13
pkm

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

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

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

Si elles sont autre chose, vous pouvez y accéder soit en parcourant @ARGV de manière explicite, soit à l'aide de la commande shift:

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

(Notez que cela avec shift ne fonctionnera que si vous êtes en dehors de tout subs. Dans un sub, il récupérera la liste des arguments passés à sub que ceux transmis au programme.)

7
Dave Sherohman
my $output_file;

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

{

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


}
5
user3331697

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

2
Marc