当包使用getopt时,perl脚本中的ARGV为空
我使用当包使用getopt时,perl脚本中的ARGV为空,perl,getopt,Perl,Getopt,我使用Getopt::Long来处理Perl脚本输入,创建的子模块位于一个包中,并使用Getopt::Long来处理输入 在测试Perl脚本中调用此子模块时,@ARGV为空 请帮助检查我的脚本有什么问题 当子模块不在包中并且从shell调用时,@ARGV是正确的,并且工作良好 我通读了一遍,在问之前用谷歌搜索了一下。不幸的是,我没有找到答案 我使用Getopt::Long的pass_-through功能,因为我想将其传递给叶子模块 package getopt_sample; use Geto
Getopt::Long
来处理Perl脚本输入,创建的子模块位于一个包中,并使用Getopt::Long
来处理输入
在测试Perl脚本中调用此子模块时,@ARGV
为空
请帮助检查我的脚本有什么问题
当子模块不在包中并且从shell调用时,@ARGV
是正确的,并且工作良好
我通读了一遍,在问之前用谷歌搜索了一下。不幸的是,我没有找到答案
我使用Getopt::Long
的pass_-through
功能,因为我想将其传递给叶子模块
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'
);
$ ./test_script
-1
$ ./test_script foo bar baz -h
3
foo bar baz -h
help
foo bar baz
如果在运行测试脚本时在
@ARGV
中找不到任何内容,那是因为没有向测试脚本传递任何命令行参数:
#!/usr/local/bin/perl
use lib './';
use getopt_sample;
&getopt_sample::getopt_sample (
'-mode' => "m0",
'-mode1' => "m1",
'-h'
);
$ ./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
的子菜单中的code>
另外,不要在用户定义的子调用前面加&
。这是一种Perl 4实践,在Perl 5中不再需要它,它有一些副作用,您可能不知道,因此也不想知道。我不清楚什么是真正不起作用的?是否希望getopt_sample使用传递的参数,并且在传递时不使用@ARGV。你是想像你一样传递它,还是想像你一样解析它?这里似乎很好(在Ubuntu 14.10上使用Perl v5.20):test.pl-mode=y a b c
给出了输出:3\n-mode=y a b c\na b c
@nichola7s:为了理解你的意思,我对你的问题做了一些修改。请你检查一下是否正确,是否仍然正确?@Borodin,编辑看起来不错。我没有意识到@u是用于子例程的,getopt只接受ARGV。我试图使用getopt来处理子例程的输入实际上,getopt可以使用变量而不是ARGV吗?谢谢,NicholasTest命令行:./test.pls谢谢你的回答,我以前使用perl进行快速而繁琐的工作,但我不太理解ARGV和@的区别。研究完文档后,ARGV来自cmd行,在主脚本和子例程中共享,@u表示子例程。这就是为什么我的子程序无法解析输入。如果我想使用getopt-in子例程,“@ARGV=(@ARGV,@);”可以工作。做同样的事有什么优雅的方式吗?getopt可以接受其他变量作为输入吗?也许其他软件包更愿意做这种事情?谢谢,尼古拉斯