2008-12-12 3 views
122

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

Пример:

script.pl "string1" "string2" 
+0

Какие оболочки вы используете? – reinierpost 2012-04-17 12:14:33

+3

Ну, во-первых, вам понадобится, чтобы это было `./Script.pl` или целая lotta nothin 'будет происходить при запуске. – 2014-07-21 19:59:41

ответ

172

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

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

+27

$ ARGV [0] - первый аргумент; perl подсчитывается от 0, а имя программы находится в $ 0, а не @ARGV. – derobert 2008-12-12 05:50:19

+4

, несмотря на путаницу $ ARGV [0]. Это тот ответ, который я надеюсь найти, когда я ищу SO, спасибо и +1 от меня. – lexu 2008-12-12 06:23:59

56

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

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

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

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

} 

От here.

+7

Стоит также отметить, что в некоторых языках программирования первый (0) аргумент является самой командой или сценарием ... но не в perl, конечно, конечно. – danieltalsky 2008-12-12 05:46:12

+9

Вместо `$ # ARGV + 1` вы могли бы также сказать, что` @ ARGV` – 2008-12-12 09:21:18

+0

просто используют `ARGV [0]` или `$ argv [1]`, если вы ищете конкретный аргумент. – Manoj 2016-11-25 11:19:43

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

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

+0

Если вы не используете getopts, я бы рекомендовал не разрушающе перемещать список аргументов. На основе http://www.perlmeme.org/howtos/syntax/foreach.html похоже, что синтаксис верен; для оговорки, проверьте раздел, _Side-effects: Управляющая переменная является псевдонимом элемента списка_ – jaredor 2008-12-12 15:32:39

7

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

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

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

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

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

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

2

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

23

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

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

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

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 

Или увидеть the original article для более подробной информации:

13

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

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

Perl tmp.pl 1 2 3 4 5

enter image description here

5
my $output_file; 

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

{ 

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


} 
Смежные вопросы