首页 > 解决方案 > 在子例程中运行 Getopt::Long::GetOptions 的正确方法

问题描述

您好我正在使用 Debian Linux 和 Perl 5.28 并尝试在子例程(类的方法)中运行。

调用部分由工具包对象 $TK 生成:

# Usage sugar: help, man and version for the CLI
my $IS_MAN;  # Flag show man page
my $IS_HELP; # Flag show help page
my $IS_VER;  # Flag show version

# Variables for the CLI
my $OUTPUT;    # IPC Variable to manage an operation status
my $RESPONSE;  # IPC Variable to state a response type INFO, WARN, ERROR...
my $COMMAND;   # Current command to address a routine in this tool
my $BCK_NAME;  # Name to manage the backup session under an ID
my $ARC_SIZE;  # Size of the expected archive size
my $TAPE_SIZE; # Size of the expected tape volume
my $WORK_PATH; # Work path canonical usually given by $ENV{TOOL_BACKUP}

# Read the param's into vars
$TK->parseCommandline(
    {            
    "command|c=s"      => \$COMMAND,
    "help|h"           => \$IS_HELP,
    "man|m"            => \$IS_MAN,
    "version|v"        => \$IS_VER,
    "output|o=s"       => \$OUTPUT,
    "response|r=s"     => \$RESPONSE,
    "backup-name|B=s"  => \$BCK_NAME,
    'tape-size|T=s'    => \$TAPE_SIZE,
    'archive-size|A=s' => \$ARC_SIZE,
    'work-path|W=s'    => \$WORK_PATH,
   } 
);

$TK 类应运行命令行解析器(方法),并带有明确定义的错误退出过程和规范输出。错误捕捉效果很好。但是我无法通过有效的开关获取 CLI 参数。

sub parseCommandline($$) {
    my ($self, $opt) = @_;

    # Catch errors thrown by GetOptions
    my $sigFun = $SIG{__WARN__};
    my @errs =();
    $SIG{__WARN__} = sub {
        my $msg = shift;
        chomp($msg);
        push( @errs, $msg );
     };

    # Dump the predefined switches
    print Dumper($opt);

    # Get the options
    GetOptions( $opt)
        or exitFatalConfig($self,
            join( ";\n", @errs ) . "!");

    # Restore the warnings
    $SIG{__WARN__} = $sigFun;

    # Go into init-runtime mode
    $self->runtime->{+KEY_COMMAND} = 'init-runtime';
}
  

尽管启用了选项 -o,但该方法始终标记错误。

IO.MAGIC:  TEST.TOOL.V1.2
IO.COMMAND:  ./Test-App -o TEST.VARIABLE
$VAR1 = {
          'tape-size|T=s' => \undef,
          'backup-name|B=s' => \undef,
          'output|o=s' => \undef,   <------ HERE 
          'work-path|W=s' => \undef,
          'response|r=s' => \undef,
          'help|h' => \undef,
          'man|m' => \undef,
          'version|v' => \undef,
          'command|c=s' => \undef,
          'archive-size|A=s' => \undef
        };
EOF.TEST.TOOL.V1.2

STATUS: FAILED
  PROGRAM:  ./Test-App
  MESSAGE:  Unknown option: o!
EOF.STATUS

这段代码有什么问题?

标签: perlsubroutinegetopt-long

解决方案


GetOptions( $opt)

应该

GetOptions(%$opt)

推荐阅读