为什么Getopt :: Long没有初始化任何值?

时间:2015-12-01 20:14:46

标签: perl

我正在尝试编写一个快速脚本,我可以传递不同的开关,以便与基于我查询的URL返回文本的Web API进行交互。因此,我没有尝试复制/粘贴URL等等,而是可以运行script.pl --history,例如......无论如何,我的代码看起来像这样

#!/usr/bin/perl

use strict;
use warnings;
use Getopt::Long qw(GetOptions);
use WWW::Curl::Easy;

my $APIKEY = "myapikey";

my $ip;
my $hist;
my $health;
my $url;
#... etc

GetOptions(
    'ip=s' => \$ip,
    'history' => \$history
    'health' => \$health
) or die "Useage: blah blah" if $history and not $ip;

if ($health) {
    $url = "appropriateurlhere";
}

#curl logic/handling/printing/etc

因此,如果我尝试做script.pl --health,并打印“$ health”,它应该被设置为某种真正的价值,但事实并非如此。这是未定义的......我无法弄清楚原因。

2 个答案:

答案 0 :(得分:5)

你的问题是if语句修饰符:

GetOptions(
    'ip=s'    => \$ip,
    'history' => \$history
    'health'  => \$health
) or die "Useage: blah blah" if $history and not $ip;  # <-- remove this if;

永远不会调用GetOptions,因为$history在达到if时会是undef。

答案 1 :(得分:2)

它工作正常(除了缺少,),但这里有一个错误:

GetOptions(
    'ip=s' => \$ip,
    'history' => \$history
    'health' => \$health
) or die "Useage: blah blah" 
if $history and not $ip;

由于$history未定义,因此GetOptions未执行if整个if X and not Y。此外,您不应该使用if X && ! Y,而应使用for (var key of Object.keys(sasa)) { $scope.data.push(sasa[key]); }