Как передать аргументы командной строки в программу Perl? - PullRequest
132 голосов
/ 12 декабря 2008

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

Пример:

script.pl "string1" "string2"

Ответы [ 9 ]

186 голосов
/ 12 декабря 2008

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

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

60 голосов
/ 12 декабря 2008

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

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

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

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

}

С здесь .

29 голосов
/ 12 декабря 2008
foreach my $arg (@ARGV) {
    print $arg, "\n";
}

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

24 голосов
/ 03 апреля 2012

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

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

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

19 голосов
/ 17 апреля 2012

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

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

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

perl tmp.pl 1 2 3 4 5

enter image description here

7 голосов
/ 12 декабря 2008

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

5 голосов
/ 20 февраля 2014
my $output_file;

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

{

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


}
2 голосов
/ 12 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...