Jak mogę przekazać argumenty wiersza poleceń do programu w Perlu?


137

Pracuję nad skryptem w Perlu. Jak mogę przekazać do niego parametry wiersza poleceń?

Przykład:

script.pl "string1" "string2"

3
Cóż, po pierwsze, będziesz tego potrzebować, ./script.plalbo wiele, nic się nie wydarzy w czasie wykonywania.
Parthian Shot

Odpowiedzi:


189

Zależy od tego, co chcesz zrobić. Jeśli chcesz użyć tych dwóch argumentów jako plików wejściowych, możesz je po prostu przekazać, a następnie użyć <>do odczytania ich zawartości.

Jeśli mają inne znaczenie, możesz je łatwo wykorzystać GetOpt::Stdi GetOpt::Longprzetworzyć. GetOpt::Stdobsługuje tylko przełączniki jednoznakowe i GetOpt::Longjest znacznie bardziej elastyczny. Od 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

Alternatywnie, @ARGVjest to specjalna zmienna, która zawiera wszystkie argumenty wiersza poleceń. $ARGV[0]jest pierwszym (tj. "string1"w twoim przypadku) i $ARGV[1]jest drugim argumentem. Nie potrzebujesz specjalnego modułu, aby uzyskać dostęp @ARGV.


29
$ ARGV [0] jest pierwszym argumentem; perl liczy od 0, a nazwa programu to $ 0, a nie @ARGV.
derobert

4
pomimo zamieszania w $ ARGV [0] .. mam nadzieję, że to jest rodzaj odpowiedzi, którą mam nadzieję znaleźć, kiedy szukam SO, dziękuję i +1 ode mnie.
lexu


60

Przekazujesz je tak, jak myślisz, aw swoim skrypcie pobierasz je z tablicy @ARGV. Tak jak to:

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

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

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

}

Od tutaj .


8
Warto również zauważyć, że w niektórych językach programowania pierwszym (0) argumentem jest sama komenda lub skrypt ... oczywiście nie w perlu.
danieltalsky

10
Zamiast $#ARGV + 1ciebie mógłbyś też powiedzieć@ARGV
Leon Timmermans

1
po prostu użyj ARGV[0]lub $argv[1]jeśli szukasz konkretnego argumentu.
Manoj

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

wypisze każdy argument.


Jeśli nie używasz getopts, w ten sposób poleciłbym nieniszczące przeglądanie listy argumentów. Na podstawie perlmeme.org/howtos/syntax/foreach.html wygląda na to, że składnia jest poprawna; dla zastrzeżenia, sprawdź sekcję Efekty uboczne: zmienna kontrolna jest aliasem do elementu listy
jaredor

24

Alternatywnie, bardziej seksowny, niebezpieczny sposób .....

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

„Zakłada” dwie wartości są przekazywane. Dodatkowy kod może zweryfikować, że założenie jest bezpieczne.


6
Nie jestem pewien, jakie to nowe informacje, ale zdecydowałem się nie głosować przeciw, ponieważ jesteś nowy.
Joel Berger

To nie jest bardziej seksowne. Wszystkie argumenty są dostępne @ARGVbez żadnej akcji z Twojej strony, tak jak C / C ++ dostarcza je przez argv / argc
Eugen Konkov

21

Jeszcze inną opcją jest użycie perl -s, np:

#!/usr/bin/perl -s

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

Następnie nazwij to tak:

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

Więcej informacji można znaleźć w oryginalnym artykule :


13

Możesz uzyskać do nich bezpośredni dostęp, przypisując specjalną zmienną @ARGVdo listy zmiennych. Na przykład:

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

perl tmp.pl 1 2 3 4 5

wprowadź opis obrazu tutaj


7

Jeśli argumenty są nazwami plików, z których mają być odczytane, użyj operatora rombu (<>), aby uzyskać dostęp do ich zawartości:

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

Jeśli argumentami są opcje / przełączniki, użyj GetOpt :: Std lub GetOpt :: Long, jak już pokazano na slavy13.myopenid.com.

Jeśli nie ma szans, że są czymś innym, możesz uzyskać do nich dostęp, przechodząc bezpośrednio przez @ARGV lub za pomocą shiftpolecenia:

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

(Zauważ, że zrobienie tego z shiftzadziała tylko wtedy, gdy jesteś poza wszystkimi subs. Wewnątrz a sub, pobierze listę argumentów przekazanych do programu, suba nie tych przekazanych do programu).


5
my $output_file;

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

{

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


}

2

Jeśli potrzebujesz tylko niektórych wartości, możesz po prostu użyć tablicy @ARGV. Ale jeśli szukasz czegoś mocniejszego do przetwarzania niektórych opcji wiersza poleceń, powinieneś użyć Getopt :: Long .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.