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

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

Пример:

script.pl "string1" "string2"
12.12.2008 03:05:06
Ну, во-первых, вам нужно, чтобы это было, ./script.plили целая лотота ничего не произойдет, во время выполнения.
Parthian Shot 21.07.2014 19:59:41
9 ОТВЕТОВ
РЕШЕНИЕ

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

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

189
24.10.2016 19:37:36
$ ARGV [0] - первый аргумент; perl считается от 0, а имя программы в $ 0, а не @ARGV.
derobert 12.12.2008 05:50:19
несмотря на путаницу $ ARGV [0] ... я надеюсь найти такой ответ, когда я ищу SO, спасибо и +1 от меня.
lexu 12.12.2008 06:23:59
Eugen Konkov 8.10.2016 14:01:23

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

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

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

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

}

От сюда .

60
14.02.2017 15:36:41
Также стоит отметить, что в некоторых языках программирования первый (0) аргумент - это сама команда или скрипт ... хотя, конечно, не в Perl.
danieltalsky 12.12.2008 05:46:12
Вместо $#ARGV + 1вас тоже можно было бы сказать@ARGV
Leon Timmermans 12.12.2008 09:21:18
просто используйте ARGV[0]или, $argv[1]если вы ищете конкретный аргумент.
Manoj 25.11.2016 11:19:43
foreach my $arg (@ARGV) {
    print $arg, "\n";
}

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

29
12.12.2008 03:14:42
Если не использовать getopts, я бы порекомендовал неразрушающий обход списка аргументов. На основании perlmeme.org/howtos/syntax/foreach.html похоже, что синтаксис правильный; для предостережения, проверьте раздел, Побочные эффекты: переменная управления является псевдонимом к элементу списка
jaredor 12.12.2008 15:32:39

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

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а не переданных в программу.)

7
12.12.2008 06:18:01

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

2
12.12.2008 13:37:23

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

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

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

24
2.04.2012 21:32:28
Не уверен, как это новая информация, но я решил отказаться от, так как вы новичок.
Joel Berger 3.04.2012 04:31:08
Это не сексуально. Все аргументы доступны @ARGVбез каких-либо действий с вашей стороны, так же, как C / C ++ предоставляет их через argv / argc
Eugen Konkov 8.10.2016 13:52:27

Еще одним вариантом является использование 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

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

21
17.04.2012 12:03:55

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

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

perl tmp.pl 1 2 3 4 5

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

13
23.12.2015 06:44:18
my $output_file;

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

{

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


}
5
20.02.2014 08:17:05