使用 Perl 从 Pingdom 打印 URL
Printing the URL from Pingdom using Perl
我正在遍历从 Pingdom 的 "Get Detailed Check Information"-API 返回的解码 JSON。我正在尝试在 JSON 数据中打印 URL,但我很难做到。
这是我得到的 JSON 回复:
{
"check" : {
"id" : 85975,
"name" : "My check 7",
"resolution" : 1,
"sendtoemail" : false,
"sendtosms" : false,
"sendtotwitter" : false,
"sendtoiphone" : false,
"sendnotificationwhendown" : 0,
"notifyagainevery" : 0,
"notifywhenbackup" : false,
"created" : 1240394682,
"type" : {
"http" : {
"url" : "/",
"port" : 80,
"requestheaders" : {
"User-Agent" : "Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)"
}
}
},
"hostname" : "s7.mydomain.com",
"status" : "up",
"lasterrortime" : 1293143467,
"lasttesttime" : 1294064823
}
}
这是我的 Perl 代码,应该打印 URL:
my $decoded_info = decode_json($json) or die "Failed to decode!\n";
foreach my $check( $decoded_info->{check}) {
print "$decoded_info->{$check}->{type}->{http}->{url}\n";
}
我已经阅读了 Perl 参考资料和教程,但它仍然不起作用。
你想要
$decoded_info->{check}->{type}->{http}->{url} # ok
和$check
的值为
$decoded_info->{check};
所以你应该使用
$check->{type}->{http}->{url} # ok
而不是
$decoded_info->{$check}->{type}->{http}->{url} # BAD
顺便说一句,
my $check = $decoded_info->{check};
...
比
简单
foreach my $check( $decoded_info->{check}) {
...
}
检查中只有一项。
{
"check" : { // here
"id" : 85975,
"name" : "My check 7",
"resolution" : 1,
"sendtoemail" : false,
"sendtosms" : false,
"sendtotwitter" : false,
"sendtoiphone" : false,
"sendnotificationwhendown" : 0,
"notifyagainevery" : 0,
"notifywhenbackup" : false,
"created" : 1240394682,
"type" : {
"http" : {
"url" : "/",
"port" : 80,
"requestheaders" : {
"User-Agent" : "Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)"
}
}
},
"hostname" : "s7.mydomain.com",
"status" : "up",
"lasterrortime" : 1293143467,
"lasttesttime" : 1294064823
}
}
没有理由迭代任何东西。您可以摆脱 foreach
循环并简单地使用字符串 check
作为哈希键。
# vvvvv
print "$decoded_info->{check}->{type}->{http}->{url}\n";
我正在遍历从 Pingdom 的 "Get Detailed Check Information"-API 返回的解码 JSON。我正在尝试在 JSON 数据中打印 URL,但我很难做到。
这是我得到的 JSON 回复:
{
"check" : {
"id" : 85975,
"name" : "My check 7",
"resolution" : 1,
"sendtoemail" : false,
"sendtosms" : false,
"sendtotwitter" : false,
"sendtoiphone" : false,
"sendnotificationwhendown" : 0,
"notifyagainevery" : 0,
"notifywhenbackup" : false,
"created" : 1240394682,
"type" : {
"http" : {
"url" : "/",
"port" : 80,
"requestheaders" : {
"User-Agent" : "Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)"
}
}
},
"hostname" : "s7.mydomain.com",
"status" : "up",
"lasterrortime" : 1293143467,
"lasttesttime" : 1294064823
}
}
这是我的 Perl 代码,应该打印 URL:
my $decoded_info = decode_json($json) or die "Failed to decode!\n";
foreach my $check( $decoded_info->{check}) {
print "$decoded_info->{$check}->{type}->{http}->{url}\n";
}
我已经阅读了 Perl 参考资料和教程,但它仍然不起作用。
你想要
$decoded_info->{check}->{type}->{http}->{url} # ok
和$check
的值为
$decoded_info->{check};
所以你应该使用
$check->{type}->{http}->{url} # ok
而不是
$decoded_info->{$check}->{type}->{http}->{url} # BAD
顺便说一句,
my $check = $decoded_info->{check};
...
比
简单foreach my $check( $decoded_info->{check}) {
...
}
检查中只有一项。
{
"check" : { // here
"id" : 85975,
"name" : "My check 7",
"resolution" : 1,
"sendtoemail" : false,
"sendtosms" : false,
"sendtotwitter" : false,
"sendtoiphone" : false,
"sendnotificationwhendown" : 0,
"notifyagainevery" : 0,
"notifywhenbackup" : false,
"created" : 1240394682,
"type" : {
"http" : {
"url" : "/",
"port" : 80,
"requestheaders" : {
"User-Agent" : "Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)"
}
}
},
"hostname" : "s7.mydomain.com",
"status" : "up",
"lasterrortime" : 1293143467,
"lasttesttime" : 1294064823
}
}
没有理由迭代任何东西。您可以摆脱 foreach
循环并简单地使用字符串 check
作为哈希键。
# vvvvv
print "$decoded_info->{check}->{type}->{http}->{url}\n";