Как передать аргументы командной строки программе Perl?


138

Я работаю над сценарием Perl. Как передать ему параметры командной строки?

Пример:

script.pl "string1" "string2"

3
Ну, во-первых, вам нужно, чтобы это было, ./script.plиначе во время выполнения ничего не произойдет.
Парфянский выстрел

Ответы:


191

Зависит от того, чем вы хотите заниматься. Если вы хотите использовать два аргумента в качестве входных файлов, вы можете просто передать их, а затем использовать <>для чтения их содержимого.

Если они имеют другое значение, вы можете легко их использовать GetOpt::Stdи GetOpt::Longобрабатывать. GetOpt::Stdподдерживает только односимвольные переключатели и GetOpt::Longнамного более гибок. Откуда 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

Или @ARGVэто специальная переменная, которая содержит все аргументы командной строки. $ARGV[0]это первый (т.е. "string1"в вашем случае) и $ARGV[1]второй аргумент. Для доступа не нужен специальный модуль @ARGV.


30
$ ARGV [0] - первый аргумент; perl отсчитывает от 0, а имя программы находится в $ 0, а не в @ARGV.
derobert

4
несмотря на путаницу с $ ARGV [0] ... это тот ответ, который я надеюсь найти, когда буду искать ТАК, спасибо и +1 от меня.
lexu


60

Вы передаете их, как вы думаете, и в своем скрипте вы получаете их из массива @ARGV. Вот так:

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

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

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

}

От сюда .


8
Также стоит отметить, что в некоторых языках программирования первым (0) аргументом является сама команда или скрипт ... но не в perl, конечно.
danieltalsky

10
Вместо $#ARGV + 1вас также можно было бы сказать@ARGV
Леон Тиммерманс

1
просто используйте ARGV[0]или, $argv[1]если вы ищете конкретный аргумент.
Manoj

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

напечатает каждый аргумент.


Если вы не используете getopts, я бы порекомендовал выполнить неразрушающий обход списка аргументов именно так. Судя по perlmeme.org/howtos/syntax/foreach.html, похоже, что синтаксис правильный; для предостережения проверьте раздел « Побочные эффекты: управляющая переменная является псевдонимом элемента списка»
jaredor

24

В качестве альтернативы, более сексуальный образ жизни .....

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

«Предполагает», что переданы два значения. Дополнительный код может подтвердить, что предположение безопасно.


6
Не уверен, что это новая информация, но я решил не голосовать против, так как вы новичок.
Джоэл Бергер

Это не сексуальнее. Все аргументы доступны @ARGVбез каких-либо действий с вашей стороны, точно так же, как C / C ++ предоставляет их через argv / argc
Евгений Коньков

22

Еще один вариант - использовать perl -s, например:

#!/usr/bin/perl -s

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

Тогда назовите это так:

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

Или посмотрите исходную статью для получения более подробной информации:


13

Вы можете получить к ним доступ напрямую, назначив специальную переменную @ARGVсписку переменных. Так, например:

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

perl tmp.pl 1 2 3 4 5

введите описание изображения здесь


7

Если аргументы являются именами файлов, из которых следует читать, используйте оператор ромба (<>), чтобы получить доступ к их содержимому:

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

Если аргументы являются параметрами / переключателями, используйте GetOpt :: Std или GetOpt :: Long, как уже показано на slavy13.myopenid.com.

Если это что-то другое, вы можете получить к ним доступ, явно пройдя через @ARGV или с помощью shiftкоманды:

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

(Обратите внимание, что это shiftсработает только в том случае, если вы находитесь за пределами всех subs. Внутри a subон будет получать список аргументов, переданных в, subа не в программу.)



2

Если вам просто нужны некоторые значения, вы можете просто использовать массив @ARGV. Но если вы ищете что-то более мощное для обработки некоторых параметров командной строки, вам следует использовать Getopt :: Long .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.