Je travaille sur un script Perl. Comment puis-je passer des paramètres de ligne de commande?Comment passer des arguments de ligne de commande à un programme Perl?
Exemple:
script.pl "string1" "string2"
Je travaille sur un script Perl. Comment puis-je passer des paramètres de ligne de commande?Comment passer des arguments de ligne de commande à un programme Perl?
Exemple:
script.pl "string1" "string2"
Dépend de ce que vous voulez faire. Si vous souhaitez utiliser les deux arguments en tant que fichiers d'entrée, vous pouvez simplement les transmettre et utiliser <>
pour lire leur contenu.
Si elles ont une signification différente, vous pouvez utiliser GetOpt::Std
et GetOpt::Long
pour les traiter facilement. GetOpt::Std
prend en charge uniquement 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
Alternativement, @ARGV
est une variable spéciale qui contient 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 accéder à @ARGV
.
$ ARGV [0] est le premier argument; Perl compte à partir de 0 et le nom du programme est dans $ 0 non @ARGV. – derobert
malgré la confusion $ ARGV [0] .. c'est le genre de réponse que j'espère trouver, quand je cherche SO, merci et +1 de ma part. – lexu
$ La variable ARGV est ce que j'utiliserai alors. Merci. – lamcro
Vous les passez tout comme vous pensez, et dans votre script, vous les obtenez à partir du tableau @ARGV
. Comme ceci:
my $numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments.\n";
foreach my $argnum (0 .. $#ARGV) {
print "$ARGV[$argnum]\n";
}
De here.
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 de perl, bien sûr. – danieltalsky
Au lieu de '$ # ARGV + 1', vous pouvez aussi avoir' @ ARGV' –
juste utiliser 'ARGV [0]' ou '$ argv [1]' si vous cherchez un argument particulier. – Manoj
foreach my $arg (@ARGV) {
print $arg, "\n";
}
va imprimer chaque argument.
Si je n'utilise pas getopts, voici comment je recommanderais de parcourir de manière non destructive une liste d'arguments. Basé sur http://www.perlmeme.org/howtos/syntax/foreach.html il semble que la syntaxe est correcte; Pour une mise en garde, consultez la section, _Side-effets: La variable de contrôle est un alias à l'élément de la liste_ – jaredor
Si les arguments sont les noms de fichiers à lire à partir, utilisez le diamant (<>) opérateur pour obtenir à 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.
Au hasard qu'ils sont quelque chose d'autre, vous pouvez y accéder soit en marchant à travers @ARGV explicitement ou avec la commande shift
:
while (my $arg = shift) {
print "Found argument $arg\n";
}
(Notez que faire avec shift
ne fonctionnera que si vous êtes en dehors de toutes les sub
s. Dans un sub
, il récupérera la liste des arguments passés à la sub
plutôt que ceux qui sont passés au programme.)
Si vous voulez juste des valeurs, vous pouvez simplement utiliser la @ARGV tableau. Mais si vous cherchez quelque chose de plus puissant pour effectuer un traitement des options de ligne de commande, vous devez utiliser Getopt::Long.
Alternativement, d'une manière plus sexy perlienne .....
my ($src, $dest) = @ARGV;
"Suppose" deux valeurs sont transmises. Un code supplémentaire peut vérifier que l'hypothèse est sûre.
Je ne sais pas comment c'est une nouvelle information, mais j'ai décidé contre un downvote, puisque vous êtes nouveau. –
Ce n'est pas plus sexy. Tous les arguments ** sont disponibles via '@ ARGV' sans aucune action de votre part ** tout comme C/C++ les fournit via argv/argc –
Encore une autre est d'utiliser de perl -s, par exemple:
#!/usr/bin/perl -s
print "value of -x: $x\n";
print "value of -name: $name\n";
Ensuite, appelez comme ceci:
% ./myprog -x -name=Jeff
value of -x: 1
value of -name: Jeff
Ou voir the original article pour plus de détails:
Très sympa et simple! –
Vous pouvez 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
Et comment est-il utilisé? –
vérifier le commentaire mis à jour, il vous suffit de passer de l'espace de ligne de commande séparé – pkm
my $output_file;
if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i"))
{
$output_file= chomp($ARGV[1]) ;
}
Donnez plus de détails sur votre code –
Quelle coquille utilisez-vous? – reinierpost
Eh bien, tout d'abord, vous allez avoir besoin d'être './Script.pl' ou tout un tas de choses vont se produire à l'exécution. –