如何正确使用Getopt :: Long来解析可选参数?

时间:2013-08-19 17:22:15

标签: perl getopt getopt-long

我使用Getopt :: Long来获取perl脚本的命令行选项。我想传递一个可选参数,以便我可以在指定值时执行某些操作,如果调用了该选项,则可以执行其他操作,但没有传递任何值。

脚本将被调用如下:

/root/perlscripts/pingm.pl --installdaemon

表示没有指定参数,并且:

--installdaemon=7.7.7.7

用于指定可选参数。

然后我会这样做:

Getopt::Long::Configure(qw(bundling no_getopt_compat));
GetOptions ('installdaemon:s' => \$daeminstall) or die ("Error in command line arguments\n");

下一步是我怀疑的地方。

如果我这样做:

if ($daeminstall) {
        print "I was called!\n";
        $installdaemon=1;
    }

然后,如果使用/root/perlscripts/pingm.pl --installdaemon调用脚本,则永远不会调用IF块,因为根据perldoc,如果没有指定值,则可选参数将为{1}}获取字符串。

那么如何在不传递值的情况下检查是否指定了选项?

2 个答案:

答案 0 :(得分:3)

请检查defined $daemsintall。如果已定义,则指定相应的选项;现在,您可以将它与空字符串进行比较,以查看它是否设置为某个值。

示例(它使用GetOptionsFromString方法,但方法是相同的):

use Getopt::Long(qw/GetOptionsFromString/);
my $tag;
GetOptionsFromString('--tag', 'tag:s' => \$tag);
if (defined $tag) {
    if ($tag eq '') {
        $tag = '7.7.7.7';
    }
    print $tag;
}
else {
    print 'No option supplied';
}

这是IDEOne demo

答案 1 :(得分:2)

使用defined内置功能:

use warnings;
use strict;
use Getopt::Long;

my $daeminstall;
GetOptions(
    'installdaemon:s' => \$daeminstall,
) or die;

if (length $daeminstall) {
    print "installdaemon was used, and has a value: $daeminstall\n";
}
elsif (defined $daeminstall) {
    print "installdaemon was used, but has no value\n";
}
else {
    print "installdaemon was not used\n";
}