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"

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.


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 .


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.


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.


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:


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


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


5
my $output_file;

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

{

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


}

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 .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.