ARGV пуст в Perl-скрипте, когда пакет использует getopt
Я использую Getopt::Long
для обработки ввода скрипта Perl созданный субмодуль находится в пакете и использует Getopt::Long
обрабатывать ввод.
Когда этот подмодуль вызывается в тестовом скрипте Perl, @ARGV
пустой.
Пожалуйста, помогите проверить, что не так с моим сценарием?
Когда субмодуль не находится в пакете, а вызывается из оболочки, @ARGV
правильно, и это работает хорошо.
Я прочитал Getopt::Long
Документация и гуглил, прежде чем спрашивать. К сожалению я не нашел ответа.
Я использую pass_through
особенность Getopt::Long
потому что я хочу передать его в подмодуль листа.
package getopt_sample;
use Getopt::Long qw(:config pass_through );
use FindBin qw($Bin $Script $Dir $RealBin $RealScript $RealDir);
sub getopt_sample {
my ( $mode, $mode1, $help );
$mode = "";
$mode1 = "";
print "$#ARGV\n";
print "@ARGV\n";
Getopt::Long::GetOptions(
"mode=s" => \$mode,
"mode1=s" => \$mode1,
"help|h" => \$help
);
if ($help) {
print "help\n";
}
print "@ARGV\n"; ### All the remaining unknown options will be left in $ARGV when pass_through
}
1;
Скрипт теста Perl:
#!/usr/local/bin/perl
use lib './';
use getopt_sample;
&getopt_sample::getopt_sample (
'-mode' => "m0",
'-mode1' => "m1",
'-h'
);
1 ответ
Если вы ничего не нашли в @ARGV
когда вы запускаете тестовый скрипт, это происходит потому, что вы не передаете тестовый скрипт никаких аргументов командной строки:
$ ./test_script
-1
$ ./test_script foo bar baz -h
3
foo bar baz -h
help
foo bar baz
&getopt_sample::getopt_sample ('-mode' => "m0", '-mode1' => "m1", '-h');
ничего не добавляет к @ARGV
, Параметры для вызова функции помещаются в @_
не @ARGV
,
Если вы хотите, чтобы ваш модуль принимал ввод как от @ARGV
и из параметров, с которыми вызывается саб, вы можете использовать @ARGV = (@ARGV, @_);
в подпункте, чтобы добавить эти параметры в @ARGV
,
Кроме того, не используйте префиксы, определяемые пользователем, как префикс &
, Это практика Perl 4, которая больше не требуется в Perl 5 и имеет побочные эффекты, о которых вы, вероятно, не знаете и, следовательно, не хотите.