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

127

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

Пример:

script.pl "string1" "string2"
  • 0
    Какую оболочку вы используете?
  • 3
    Ну, во-первых, вам нужно, чтобы он был ./script.pl или ./script.pl ничего не будет происходить во время выполнения.
Теги:
command-line

9 ответов

178
Лучший ответ

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

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

  • 28
    $ ARGV [0] является первым аргументом; Perl считается от 0, а имя программы в $ 0, а не @ARGV.
  • 4
    несмотря на путаницу $ ARGV [0] ... я надеюсь найти такой ответ, когда буду искать SO, спасибо и +1 от меня.
Показать ещё 2 комментария
53

Вы передаете их так, как вы думаете, и в своем script вы получите их из массива @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.
  • 9
    Вместо $#ARGV + 1 вы могли бы также сказать @ARGV
Показать ещё 1 комментарий
28
foreach my $arg (@ARGV) {
    print $arg, "\n";
}

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

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

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

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

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

  • 6
    Не уверен, как это новая информация, но я решил отказаться от, так как вы новичок.
  • 0
    Это не сексуально. Все аргументы доступны через @ARGV без каких-либо действий с вашей стороны, как C / C ++ предоставляет их через argv / argc
19

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

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

  • 0
    Очень красиво и просто!
13

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

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

perl tmp.pl 1 2 3 4 5

Изображение 7732

  • 0
    И как это используется?
  • 0
    проверьте обновленный комментарий, вам просто нужно перейти из командной строки, разделенных
7

Если аргументы являются именами файлов, которые необходимо прочитать, используйте оператор 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 будет работать, только если вы находитесь за пределами всех sub s. Внутри sub он будет извлекать список аргументов, переданных в sub, а не те, которые были переданы программы.)

5
my $output_file;

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

{

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


}
  • 2
    Дайте более подробную информацию о вашем коде
2

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню