在 Perl 中读取可选的命令行参数
Read optional command-line arguments in Perl
我是 Perl 的新手,我对它对可选参数的处理感到困惑。
如果我有一个 perl 脚本,它是通过以下方式调用的:
plgrep [-f] < perl regular expression > < file/directory list >
如何确定命令行中是否给出了 -f
运算符?
使用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: [=10=] [options]\n"; # -f or -flag, etc
}
$flag
如果足够的话,也可以简单地测试其真实性。只检查 -f
是否存在,只需要: GetOptions('f' => $flag); if ($flag) { };
.
该模块检查调用是否按预期指定参数。这些不需要输入,它们是 "options." 但是,对于意外调用,会打印 die
或 warn
消息(在上面的代码中,我们的用法消息也被打印出来,脚本退出).因此对于 script.pl -a
脚本退出并带有消息(来自模块和子)。
如果没有歧义,选项名称的缩写是可以的; script.pl -fl 0.5
退出并显示消息(-flag
或 -float
?),而 script.pl -i 5
正常且 $integer
设置为 5。另一方面,如果整数是not supplied after -i
这是一个错误,因为该选项被定义为取一个。可以为选项指定多个名称,例如 f|flag
。等等,还有很多。
传递给您程序的所有参数都出现在数组 @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 以指示指定选项
我是 Perl 的新手,我对它对可选参数的处理感到困惑。
如果我有一个 perl 脚本,它是通过以下方式调用的:
plgrep [-f] < perl regular expression > < file/directory list >
如何确定命令行中是否给出了 -f
运算符?
使用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: [=10=] [options]\n"; # -f or -flag, etc
}
$flag
如果足够的话,也可以简单地测试其真实性。只检查 -f
是否存在,只需要: GetOptions('f' => $flag); if ($flag) { };
.
该模块检查调用是否按预期指定参数。这些不需要输入,它们是 "options." 但是,对于意外调用,会打印 die
或 warn
消息(在上面的代码中,我们的用法消息也被打印出来,脚本退出).因此对于 script.pl -a
脚本退出并带有消息(来自模块和子)。
如果没有歧义,选项名称的缩写是可以的; script.pl -fl 0.5
退出并显示消息(-flag
或 -float
?),而 script.pl -i 5
正常且 $integer
设置为 5。另一方面,如果整数是not supplied after -i
这是一个错误,因为该选项被定义为取一个。可以为选项指定多个名称,例如 f|flag
。等等,还有很多。
传递给您程序的所有参数都出现在数组 @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 以指示指定选项