Як я можу передавати аргументи командного рядка програмі Perl?


137

Я працюю над сценарієм Perl. Як я можу передати йому параметри командного рядка?

Приклад:

script.pl "string1" "string2"

3
Ну, по-перше, вам це знадобиться, ./script.plабо ж ціла лота нічого не відбудеться під час виконання.
Парфянський розстріл

Відповіді:


189

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

Якщо вони мають інше значення, ви можете використовувати 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.


29
$ ARGV [0] - перший аргумент; perl нараховується від 0, а назва програми становить $ 0, а не @ARGV.
дероберт

4
незважаючи на плутанину $ ARGV [0]. Це така відповідь, яку я сподіваюся знайти, коли я шукаю ТАК, дякую і +1 від мене.
lexu


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, звичайно.
Даніелтальський

10
Замість цього $#ARGV + 1ви могли також сказати@ARGV
Леон Тіммерманс

1
просто використовуйте ARGV[0]або $argv[1]якщо ви шукаєте конкретний аргумент.
Маной

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

буде надрукувати кожен аргумент.


Якщо ви не використовуєте getopts, саме так я рекомендував би не руйнувати список аргументів. На основі perlmeme.org/howtos/syntax/foreach.html схоже, що синтаксис правильний; Для застереження перевірте розділ, Побічні ефекти: Змінна керування є псевдонімом елемента списку
jaredor

24

Як варіант, сексуальніший приємний спосіб .....

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

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


6
Не впевнений, як це нова інформація, але я вирішив проти голоси, оскільки ви новачок.
Джоель Бергер

Це не сексуальніше. Усі аргументи доступні @ARGVбез будь-яких дій з вас, як і C / C ++, надайте їх через argv / argc
Євген Конков

21

Ще один варіант - використовувати 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

Якщо аргументи є іменами, з яких слід прочитати, скористайтеся оператором 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а не тих, що передаються програмі.)



2

Якщо ви просто хочете отримати деякі значення, ви можете просто використовувати масив @ARGV. Але якщо ви шукаєте щось більш потужне для того, щоб обробити деякі параметри командного рядка, вам слід скористатися Getopt :: Long .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.