我是 Perl 的新手,我对它对可选参数的处理感到困惑。
如果我有一个 perl 脚本,它使用以下内容调用:
plgrep [-f] < perl regular expression > < file/directory list >
我如何确定是否-f
在命令行上给出了运算符?
我是 Perl 的新手,我对它对可选参数的处理感到困惑。
如果我有一个 perl 脚本,它使用以下内容调用:
plgrep [-f] < perl regular expression > < file/directory list >
我如何确定是否-f
在命令行上给出了运算符?
传递给程序的所有参数都出现在数组@ARGV
中,因此您可以简单地检查任何数组元素是否包含字符串-f
但是,如果您正在编写一个组合使用许多不同选项的程序,您可能会发现使用该Getopt::Long
模块更简单,它允许您指定哪些参数是可选的,哪些取值,一个选项是否有多个同义词等。
调用GetOptions
允许您指定程序期望的参数,并将@ARGV
从命令行中出现的任何参数中删除,将指示符保存在简单的 Perl 变量中,这些变量反映了提供的参数以及它们具有的值(如果有的话)
例如,在您描述的简单情况下,您可以这样编写代码
use strict;
use warnings 'all';
use feature 'say';
use Getopt::Long;
use Data::Dump;
say "\nBefore GetOptions";
dd \@ARGV;
GetOptions( f => \my $f_option);
say "\nAfter GetOptions";
dd $f_option;
dd \@ARGV;
Before GetOptions
["-f", "regexp", "file"]
After GetOptions
1
["regexp", "file"]
所以你可以看到在调用 , 之前GetOptions
包含@ARGV
了命令行中的所有数据。但之后,-f
已被删除,变量$f_option
设置为 1 表示已指定选项
使用Getopt::Long。当然,您可以@ARGV
手动解析(其中包含命令行参数),但没有理由这样做,因为存在适合这项工作的好模块。
use warnings;
use strict;
use Getopt::Long;
# Set up defaults here if you wish
my ($flag, $integer, $float, $string);
usage(), exit if not GetOptions(
'f|flag!' => \$flag,
'integer:i' => \$integer,
'float:f' => \$float,
'string:s' => \$string
);
# The script now goes. Has the flag been supplied?
if (defined($flag)) { print "Got flag: $flag\n" } # it's 1
else {
# $flag variable is 'undef'
}
sub usage {
print "Usage: $0 [options]\n"; # -f or -flag, etc
}
$flag
如果足够的话,也可以简单地测试其是否为真。要仅检查是否-f
存在,只需要:GetOptions('f' => \$flag); if ($flag) { };
。
该模块检查调用是否按预期指定了参数。这些不需要输入,它们是“选项”。但是,对于意外的调用,会打印 a die
orwarn
消息(在上面的代码中,我们的使用消息也会被打印并且脚本退出)。因此,script.pl -a
对于脚本退出消息(来自模块和子)。
选项名称的缩写是可以的,如果明确的话;script.pl -fl 0.5
退出并显示消息(-flag
或-float
?),而script.pl -i 5
正常并$integer
设置为 5。另一方面,如果在此之后未提供整数是-i
错误的,因为该选项被定义为采用一个。可以指定多个选项名称,例如f|flag
. 等等。还有更多。