我可以在perl中多次调用Getopts吗?
我对perl一无所知,所以请对我的这个问题耐心一点 似乎如果我多次调用perl Getopts::Long::Getopts方法,第二个调用就会被完全忽略我可以在perl中多次调用Getopts吗?,perl,getopt-long,Perl,Getopt Long,我对perl一无所知,所以请对我的这个问题耐心一点 似乎如果我多次调用perl Getopts::Long::Getopts方法,第二个调用就会被完全忽略 这正常吗??(为什么) 这个过程的替代方案是什么 (实际上,我编写了一个模块,在其中我进行了一个GetOpts调用,使用我的模块的脚本也尝试这样做,但似乎脚本没有获得所需的选项) 谢谢, NeerajGetopts::Long在工作时改变了@ARGV,这就是它在处理完开关后在@ARGV中保留非开关值的方式。因此,当您进行第二次调用时,@ARG
NeerajGetopts::Long在工作时改变了
@ARGV
,这就是它在处理完开关后在@ARGV
中保留非开关值的方式。因此,当您进行第二次调用时,@ARGV
中没有任何内容需要解析,也没有任何有用的事情发生
然而,有:
默认情况下,GetOptions解析全局数组@ARGV
中存在的选项。一个特殊的条目GetOptionsFromArray可用于解析任意数组中的选项
因此,如果需要多次解析列表,您可以在
@ARGV
(或其他数组)的副本上使用GetOptionsFromArray
。Getopts::Long alters@ARGV
当它工作时,这就是它如何在处理开关时在@ARGV
中保留非开关值的方法。因此,当您进行第二次调用时,@ARGV
中没有任何内容需要解析,也没有任何有用的事情发生
然而,有:
默认情况下,GetOptions解析全局数组@ARGV
中存在的选项。一个特殊的条目GetOptionsFromArray可用于解析任意数组中的选项
因此,如果需要多次解析列表,您可以在
@ARGV
(或其他一些数组)的副本上使用GetOptionsFromArray
。我在一个程序中多次运行了GetOptions fromGetOptions::Long
。我拥有的是一个.optrc
文件,其中包含可由命令行覆盖的命令行选项。与.cvsrc
和.exrc
的工作方式大致相同
为此,我在.optrc文件上运行GetOptions,然后运行@ARGV
中的内容。在旧版本的GetOptions中,我必须保存@ARGV
,将.optrc
放入@ARGV中,用GetOptions
处理它,然后还原@ARGV
,并在其上运行GetOptions。较新版本的GetOpts::Long现在允许您指定数组,而不是仅使用@ARGV
我在一个程序中多次运行了GetOpts::Long
中的GetOptions。我拥有的是一个.optrc
文件,其中包含可由命令行覆盖的命令行选项。与.cvsrc
和.exrc
的工作方式大致相同
为此,我在.optrc文件上运行GetOptions,然后运行@ARGV
中的内容。在旧版本的GetOptions中,我必须保存@ARGV
,将.optrc
放入@ARGV中,用GetOptions
处理它,然后还原@ARGV
,并在其上运行GetOptions。较新版本的GetOpts::Long现在允许您指定数组,而不是仅使用@ARGV
复制@ARGV将使您一次又一次地忙于解析同一组选项。如果这是你想要的,好吧。但是
假设您的程序中使用了一组模块,这些模块只能识别@ARGV的一个子集。您要做的是从每个模块调用GetOptions,使用模块能够识别的每个选项,并将@ARGV中的其余选项留给其他模块处理
您可以通过调用
Getopt::Long::Configure qw/pass_through/;
但请参阅perldoc Getopt::Long了解各种配置的副作用强>
示例:一个脚本(o1.pl)能够识别几个选项和两个模块(o1::p1和o1::p2),它们必须能够读取自己的选项
o1.pl:
!/usr/bin/perl
o1::p1源(在o1/p1.pm中):
o1::p2源(在o1/p2.pm中):
使用以下命令运行o1.pl:
perl o1.pl --main-vi=1 --verbose --define a=ss --p1-v1=k1 --p1-v2=42 --define b=yy --p2-v1=k2 --p2-v2=66
将为您提供以下(预期)输出(p1使用了它的选项,p2完成了,然后main保留了它所知道的内容):
复制@ARGV会让您一次又一次地忙于解析同一组选项。如果这是你想要的,好吧。但是
假设您的程序中使用了一组模块,这些模块只能识别@ARGV的一个子集。您要做的是从每个模块调用GetOptions,使用模块能够识别的每个选项,并将@ARGV中的其余选项留给其他模块处理
您可以通过调用
Getopt::Long::Configure qw/pass_through/;
但请参阅perldoc Getopt::Long了解各种配置的副作用强>
示例:一个脚本(o1.pl)能够识别几个选项和两个模块(o1::p1和o1::p2),它们必须能够读取自己的选项
o1.pl:
!/usr/bin/perl
o1::p1源(在o1/p1.pm中):
o1::p2源(在o1/p2.pm中):
使用以下命令运行o1.pl:
perl o1.pl --main-vi=1 --verbose --define a=ss --p1-v1=k1 --p1-v2=42 --define b=yy --p2-v1=k2 --p2-v2=66
将为您提供以下(预期)输出(p1使用了它的选项,p2完成了,然后main保留了它所知道的内容):
这难道不是“本地”这个关键词应该用来做的事情吗
{
local @ARGV = @ARGV;
our $opt_h;
&getopts('h');
&printUsage if $opt_h;
}
# Now that the local version of @ARGV has gone out of scope, the original version of @ARGV is restored.
while (@ARGV){
my $arg = shift @ARGV;
这难道不是“本地”这个关键词应该用来做的事情吗
{
local @ARGV = @ARGV;
our $opt_h;
&getopts('h');
&printUsage if $opt_h;
}
# Now that the local version of @ARGV has gone out of scope, the original version of @ARGV is restored.
while (@ARGV){
my $arg = shift @ARGV;
这似乎是在回答另一个问题。不,你错了。我发布了我的答案,对Neeraj遇到的实际任务做了一些假设。我在第一段中明确指出了这一点,因为对我来说,一次又一次地完全解析@ARGV而不是在需要的地方传播选项是毫无意义的。这似乎是在回答其他一些问题。不,你错了。我发布了我的答案,对Neeraj面临的实际任务做了一些假设
{
local @ARGV = @ARGV;
our $opt_h;
&getopts('h');
&printUsage if $opt_h;
}
# Now that the local version of @ARGV has gone out of scope, the original version of @ARGV is restored.
while (@ARGV){
my $arg = shift @ARGV;