我可以在perl中多次调用Getopts吗?

我可以在perl中多次调用Getopts吗?,perl,getopt-long,Perl,Getopt Long,我对perl一无所知,所以请对我的这个问题耐心一点 似乎如果我多次调用perl Getopts::Long::Getopts方法,第二个调用就会被完全忽略 这正常吗??(为什么) 这个过程的替代方案是什么 (实际上,我编写了一个模块,在其中我进行了一个GetOpts调用,使用我的模块的脚本也尝试这样做,但似乎脚本没有获得所需的选项) 谢谢, NeerajGetopts::Long在工作时改变了@ARGV,这就是它在处理完开关后在@ARGV中保留非开关值的方式。因此,当您进行第二次调用时,@ARG

我对perl一无所知,所以请对我的这个问题耐心一点

似乎如果我多次调用perl Getopts::Long::Getopts方法,第二个调用就会被完全忽略

  • 这正常吗??(为什么)

  • 这个过程的替代方案是什么

  • (实际上,我编写了一个模块,在其中我进行了一个GetOpts调用,使用我的模块的脚本也尝试这样做,但似乎脚本没有获得所需的选项)

    谢谢,
    Neeraj

    Getopts::Long在工作时改变了
    @ARGV
    ,这就是它在处理完开关后在
    @ARGV
    中保留非开关值的方式。因此,当您进行第二次调用时,
    @ARGV
    中没有任何内容需要解析,也没有任何有用的事情发生

    然而,有:

    默认情况下,GetOptions解析全局数组
    @ARGV
    中存在的选项。一个特殊的条目GetOptionsFromArray可用于解析任意数组中的选项


    因此,如果需要多次解析列表,您可以在
    @ARGV
    (或其他数组)的副本上使用
    GetOptionsFromArray

    Getopts::Long alters
    @ARGV
    当它工作时,这就是它如何在处理开关时在
    @ARGV
    中保留非开关值的方法。因此,当您进行第二次调用时,
    @ARGV
    中没有任何内容需要解析,也没有任何有用的事情发生

    然而,有:

    默认情况下,GetOptions解析全局数组
    @ARGV
    中存在的选项。一个特殊的条目GetOptionsFromArray可用于解析任意数组中的选项


    因此,如果需要多次解析列表,您可以在
    @ARGV
    (或其他一些数组)的副本上使用
    GetOptionsFromArray

    我在一个程序中多次运行了
    GetOptions from
    GetOptions::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;