我正在使用Getopt::Long
来处理Perl脚本输入,创建的子模块位于包中并使用Getopt::Long
来处理输入。
在测试Perl脚本中调用此子模块时,@ARGV
为空。
请帮助检查我的脚本有什么问题?
当子模块不在包中并且从shell调用时,@ARGV
是正确的并且它运行良好。
我通过the Getopt::Long
documentation阅读并在询问之前用Google搜索。不幸的是我找不到答案。
我使用pass_through
的{{1}}功能,因为我想将它传递给叶子模块。
Getopt::Long
Perl测试脚本:
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;
答案 0 :(得分:-2)
如果在运行测试脚本时没有在@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 4练习,并且具有您可能不知道的副作用,因此不需要。