Как передать аргументы командной строки программе 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.

user44511
источник
30
$ ARGV [0] - первый аргумент; perl отсчитывает от 0, а имя программы находится в $ 0, а не в @ARGV.
derobert
4
несмотря на путаницу с $ ARGV [0] ... это тот ответ, который я надеюсь найти, когда буду искать ТАК, спасибо и +1 от меня.
lexu
@lamcro $ ARGV -Contains the name of the current file when reading from <> .
Евгений Коньков
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";
}

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

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

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

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

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

растин71
источник
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а не в программу.)

Дэйв Шерохман
источник
5
my $output_file;

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

{

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


}
пользователь3331697
источник
2

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

Марк
источник