1

我使用 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;
    }

然后,如果使用 调用脚本,则永远不会调用该 IF 块,因为根据 perldoc,如果未指定值/root/perlscripts/pingm.pl --installdaemon,则可选参数将用作字符串。''

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

4

2 回答 2

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 演示

于 2013-08-19T17:37:35.513 回答
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";
}
于 2013-08-19T17:39:38.163 回答