以下是我的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
答案 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_parameter
(use 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上是等价的:
如有疑问,请在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解析命令行,识别并删除指定的选项及其可能的值。