Как использовать GetOptions, чтобы получить аргумент по умолчанию? - PullRequest
3 голосов
/ 13 ноября 2009

Я прочитал документ для GetOptions, но я не могу найти то, что мне нужно ... (возможно, я слепой)

Что я хочу сделать, так это проанализировать командную строку

myperlscript.pl -mode [sth] [inputfile]

Я могу использовать часть -mode, но я не уверен, как получить [inputfile]. Любой совет будет оценен.

Ответы [ 4 ]

8 голосов
/ 13 ноября 2009

Вы не используете GetOptions для этой задачи. GetOptions просто проанализирует опции и оставит все, что не является опцией, в @ARGV. Поэтому после вызова GetOptions просто посмотрите на @ARGV любые имена файлов, переданные в командной строке.

6 голосов
/ 13 ноября 2009

GetOptions оставит все аргументы, которые он не проанализировал, в переменной @ARGV. Таким образом, вы можете просто перебрать переменную @ARGV.

use Getopt::Long;
my %opt;
GetOptions(
  \%opt,
  'mode=s'
);

for my $filename (@ARGV){
  parse( $filename, \%opt );
}

Существует еще один вариант, вы можете использовать специальный параметр обратного вызова <> аргумента.

use Getopt::Long qw'permute';
our %opt;
GetOptions(
  \%opt,
  'mode=s',
  '<>' => sub{
    my($filename) = @_;
    parse( $filename, \%opt );
  }
);

Это полезно, если вы хотите работать с несколькими файлами, но для некоторых из них используйте разные опции.

perl test.pl -mode s file1 file2 -mode t file3

В этом примере для $opt{mode} будет установлено значение s, затем будет вызван parse с аргументом file1. Затем он вызовет parse с file2 в качестве аргумента. Затем он изменит $opt{mode} на t и вызовет parse с file3 в качестве аргумента.

6 голосов
/ 13 ноября 2009

Все, что не обрабатывается GetOptions, остается в @ARGV. Так что вы, вероятно, захотите что-то вроде

use Getopt::Long;
my %opt
my $inputfile = 'default';
GetOptions(\%opt, 'mode=s');
$inputfile = $ARGV[0] if defined $ARGV[0];
3 голосов
/ 13 ноября 2009

Аргументы командной строки, которые не начинаются с -, все равно будут в @ARGV, не так ли?

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