Getopt :: Long和Pod :: Usage的问题

时间:2014-05-23 08:29:19

标签: perl

以下是我的perl脚本中的内容。如果我用参数运行它,它打印用法就好像@ARGV == 0.任何人都可以找出原因吗?

GetOptions (
    'param=s'   => \my $opt_parameter, 
    'o=s'       => \my $opt_o,
    'r=s'       => \my $opt_r,
    'g=s'       => \my $opt_g,
    'len=i'     => \my $opt_rl,
    'ct=i'      => \my $opt_ct,
    'help|?'    => \(my $opt_help = 0),
    'man'       => \(my $opt_man = 0),
) or pod2usage(2); 

pod2usage(1) if $opt_help;
pod2usage(-verbose => 2) if $opt_man;
pod2usage("$0: No files given.") if (@ARGV == 0);

给出的命令:

script.pl -o=value1 -r=value2 -g=value3 -len=integervalue1 -ct=integervalue2

4 个答案:

答案 0 :(得分:1)

以下是我认为你想要的:

#!/usr/bin/env perl

use strict;
use warnings;

use Getopt::Long;
use Pod::Usage;

my ($opt_parameter, $opt_o, $opt_r, $opt_g, $opt_rl, $opt_ct);
my $opt_help = 0;
my $opt_man = 0;
my @files;

GetOptions (
        '<>'      =>    sub { push @files, shift },
        'param=s' =>    \$opt_parameter,    
        'o=s'       =>  \$opt_o,
        'r=s'       =>  \$opt_r,
        'g=s'       =>  \$opt_g,
        'len=i'     =>  \$opt_rl,
        'ct=i'      =>  \$opt_ct,
        'help|?' =>     \$opt_help,
        'man'   =>      \$opt_man) or pod2usage(2); 

pod2usage(1) if $opt_help;

pod2usage(-verbose => 2) if $opt_man;

pod2usage("$0: No files given.") if (@files == 0);

print "$_\n" for ( @files );

运行它:

-o=value1 -r=value2 -g=value3 --len=1 --ct=2 file1 file2

差异在于:

  • (添加了shebang和use。)

  • $opt_parameters重命名为$opt_parameteruse strict;应该已经抓住了这一点。)

  • 添加了'<>'选项和@files以存储non-option arguments

  • 查看@files而不是@ARGV的大小。 (后者已被GetOptions()清除。)

  • (最后打印@files只是为了看它是否有效。)

  • 长选项的双击。

  • 将整数赋给整数类型选项(--len--ct);字符串将使解析失败。

  • (在;之后断开行以便能够阅读代码。)

答案 1 :(得分:0)

您可能遇到此问题。

GetOptions does not split the command line correctly

  

命令行不是由GetOptions拆分,而是由命令行拆分   解释器(CLI)。在Unix上,这是shell。在Windows上,它是   COMMAND.COM或CMD.EXE。其他操作系统具有其他CLI。它是   重要的是要知道这些CLI在行为时可能会有所不同   命令行包含特殊字符,特别是引号或   反斜杠。例如,对于Unix shell,您可以使用单引号   (')和双引号(“)将单词组合在一起。以下   替代品在Unix上是等价的:

  • “两个字”
  • '两个字'
  • 两个\ words

如有疑问,请在Perl程序前插入以下语句:

print STDERR (join("|",@ARGV),"\n"); 

验证CLI如何将参数传递给程序。

答案 2 :(得分:-1)

感谢亚当泰勒,我想出了我的问题。他指出我的@ARGV在处理完我的论证后是空的,这是真的。如果我发表声明:

pod2usage("$0: No files given.") if (@ARGV == 0);

在我的GetOptions语句之前,它在传递参数之前检查@ARGV是有效的。谢谢大家帮忙解决问题!

答案 3 :(得分:-1)

GetOpt::Long解析并删除@ARGV中的args。

来自文档:

Getopt :: Long模块实现了一个名为GetOptions()的扩展getopt函数。它从@ARGV解析命令行,识别并删除指定的选项及其可能的值。