当包使用getopt

时间:2015-11-29 07:42:29

标签: perl getopt

我正在使用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;

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练习,并且具有您可能不知道的副作用,因此不需要。