当包使用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可以接受其他变量作为输入吗?也许其他软件包更愿意做这种事情?谢谢,尼古拉斯