Wie kann ich Befehlszeilenargumente an ein Perl-Programm übergeben?

137

Ich arbeite an einem Perl-Skript. Wie kann ich Befehlszeilenparameter übergeben?

Beispiel:

script.pl "string1" "string2"
Lamcro
quelle
3
Nun, zuerst einmal wirst du es brauchen, sonst ./script.plwird zur Laufzeit eine ganze Menge nichts passieren.
Parthian Shot

Antworten:

189

Kommt darauf an, was du machen willst. Wenn Sie die beiden Argumente als Eingabedateien verwenden möchten, können Sie sie einfach übergeben und dann <>zum Lesen ihres Inhalts verwenden.

Wenn sie eine andere Bedeutung haben, können Sie sie einfach verwenden GetOpt::Stdund GetOpt::Longverarbeiten. GetOpt::Stdunterstützt nur Einzelzeichenschalter und GetOpt::Longist viel flexibler. Von 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

Alternativ @ARGVist eine spezielle Variable, die alle Befehlszeilenargumente enthält. $ARGV[0]ist das erste (dh "string1"in Ihrem Fall) und $ARGV[1]ist das zweite Argument. Sie benötigen kein spezielles Modul für den Zugriff @ARGV.

user44511
quelle
29
$ ARGV [0] ist das erste Argument; Perl zählt von 0 und der Programmname ist in $ 0 und nicht in @ARGV.
Derobert
4
Trotz der $ ARGV [0] Verwirrung. Dies ist die Art von Antwort, die ich hoffe zu finden, wenn ich SO suche, danke und +1 von mir.
Lexu
60

Sie geben sie so weiter, wie Sie denken, und in Ihrem Skript erhalten Sie sie aus dem Array @ARGV. Wie so:

my $numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments.\n";

foreach my $argnum (0 .. $#ARGV) {

   print "$ARGV[$argnum]\n";

}

Von hier aus .

George Stocker
quelle
8
Es ist auch erwähnenswert, dass in einigen Programmiersprachen das erste (0) Argument der Befehl oder das Skript selbst ist ... natürlich nicht in Perl.
danieltalsky
10
Anstelle von $#ARGV + 1dir hätte man auch sagen können@ARGV
Leon Timmermans
1
Verwenden Sie einfach ARGV[0]oder $argv[1]wenn Sie nach einem bestimmten Argument suchen.
Manoj
29
foreach my $arg (@ARGV) {
    print $arg, "\n";
}

druckt jedes Argument.

nrich
quelle
Wenn Sie getopts nicht verwenden, würde ich empfehlen, eine Argumentliste zerstörungsfrei zu durchlaufen. Basierend auf perlmeme.org/howtos/syntax/foreach.html sieht es so aus, als ob die Syntax korrekt ist. Überprüfen Sie für eine Einschränkung den Abschnitt Nebenwirkungen: Die
Steuervariable
24

Alternativ eine sexier perlish Art .....

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

"Angenommen" zwei Werte werden übergeben. Zusätzlicher Code kann überprüfen, ob die Annahme sicher ist.

rastin71
quelle
6
Ich bin mir nicht sicher, wie das neue Informationen sind, aber ich habe mich gegen eine Ablehnung entschieden, da du neu bist.
Joel Berger
Es ist nicht sexier. Alle Argumente sind @ARGVohne Aktion von Ihnen verfügbar , genau wie C / C ++ sie über argv / argc liefert
Eugen Konkov
21

Eine weitere Option ist die Verwendung von Perl-s, z.

#!/usr/bin/perl -s

print "value of -x: $x\n";
print "value of -name: $name\n";

Dann nenne es so:

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

Oder lesen Sie den Originalartikel für weitere Details:

Joao Costa
quelle
13

Sie können direkt darauf zugreifen, indem Sie die spezielle Variable @ARGVeiner Liste von Variablen zuweisen . Also zum Beispiel:

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

perl tmp.pl 1 2 3 4 5

Geben Sie hier die Bildbeschreibung ein

pkm
quelle
7

Wenn es sich bei den Argumenten um Dateinamen handelt, aus denen gelesen werden soll, verwenden Sie den Operator diamant (<>), um zu deren Inhalt zu gelangen:

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

Wenn die Argumente Optionen / Schalter sind, verwenden Sie GetOpt :: Std oder GetOpt :: Long, wie bereits von slavy13.myopenid.com gezeigt.

Wenn es sich nicht um etwas anderes handelt, können Sie entweder explizit durch @ARGV oder mit dem folgenden shiftBefehl darauf zugreifen :

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

(Beachten Sie, dass dies shiftnur funktioniert, wenn Sie sich außerhalb aller subs befinden. Innerhalb von a subwird die Liste der Argumente abgerufen, die suban das Programm übergeben wurden, und nicht an das Programm.)

Dave Sherohman
quelle
5
my $output_file;

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

{

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


}
user3331697
quelle
2

Wenn Sie nur einige Werte möchten, können Sie einfach das @ ARGV-Array verwenden. Wenn Sie jedoch nach etwas Stärkerem suchen, um einige Befehlszeilenoptionen zu verarbeiten, sollten Sie Getopt :: Long verwenden .

Marc
quelle