2008-12-12 5 views

Répondre

172

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.

+27

$ ARGV [0] est le premier argument; Perl compte à partir de 0 et le nom du programme est dans $ 0 non @ARGV. – derobert

+4

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

+0

$ La variable ARGV est ce que j'utiliserai alors. Merci. – lamcro

56

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.

+7

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

+9

Au lieu de '$ # ARGV + 1', vous pouvez aussi avoir' @ ARGV' –

+0

juste utiliser 'ARGV [0]' ou '$ argv [1]' si vous cherchez un argument particulier. – Manoj

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

va imprimer chaque argument.

+0

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

7

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.)

2

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.

23

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.

+6

Je ne sais pas comment c'est une nouvelle information, mais j'ai décidé contre un downvote, puisque vous êtes nouveau. –

+0

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 –

19

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:

+0

Très sympa et simple! –

13

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

enter image description here

+0

Et comment est-il utilisé? –

+0

vérifier le commentaire mis à jour, il vous suffit de passer de l'espace de ligne de commande séparé – pkm

5
my $output_file; 

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

{ 

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


} 
+2

Donnez plus de détails sur votre code –

Questions connexes