在Perl中读取可选的命令行参数

时间:2016-02-26 21:15:27

标签: perl optional-arguments

我是Perl的新手,我对它的可选参数的处理感到困惑。

如果我有一个perl脚本,它被调用了以下内容:

plgrep [-f] < perl regular expression > < file/directory list > 

如何在命令行中确定是否给出-f运算符?

2 个答案:

答案 0 :(得分: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) { };

模块检查调用是否按预期指定参数。这些不需要输入,它们是“选项”。但是,对于意外调用,将打印diewarn消息(在上面的代码中,我们的用法消息也会被打印并且脚本退出)。因此对于script.pl -a,脚本以消息(来自模块和子)退出。

选项名称的缩写是正确的,如果明确的话; script.pl -fl 0.5退出时会显示消息(-flag-float?),而script.pl -i 5正常且$integer设置为5.另一方面,如果整数是-i之后提供的 not 是一个错误,因为该选项被定义为一个。可以指定多个选项名称,例如f|flag。等等。还有更多。

答案 1 :(得分:1)

传递给程序的所有参数都显示在数组@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,表示该选项已指定