空哈希和'在数字ge中使用未初始化的值(> =)'

时间:2015-12-04 09:50:32

标签: perl nagios

我对github上找到的这个代码有疑问,并改变了我的需求。它通常工作正常,但我收到一些让我担心的警告。

Use of uninitialized value in numeric ge (>=) at ./check_puppetdash line 192.
Use of uninitialized value in numeric ge (>=) at ./check_puppetdash line 192.
Use of uninitialized value in numeric ge (>=) at ./check_puppetdash line 192.
Use of uninitialized value in numeric ge (>=) at ./check_puppetdash line 192.
Use of uninitialized value in numeric ge (>=) at ./check_puppetdash line 192.
Use of uninitialized value in numeric ge (>=) at ./check_puppetdash line 192.

第192行看起来像这样:

189 # Gather values for status details
190 my $details = '';
191 foreach (@interests) {
192    if ($nodes{$_} >= $thresholds_warning{$_}){          
193        $details = $details . $_ . " = " . $nodes{$_} . "; ";
194  }
195 }

我将其固定到上面定义的哈希%节点:

# Parse the markup, loading up anything that matches into the %nodes hash
my %nodes;
foreach my $line(split('\n', $response->decoded_content)) {
if($line=~m/<a href="\/nodes\/(\w+)">(\d+)<\/a>/) {
    $nodes{$1} = $2;
 }
}

#Gather perfomance data
foreach my $interest(@interests) {
$np->add_perfdata(
    label => $interest,
    value => defined($nodes{$interest}) ? $nodes{$interest} : 0,
    uom   => undef,
 );
}

我在现有脚本中使用了该部分。 当我在脚本中的任何地方打印%节点的内容时,我得到一个空行。

我对perl不是很有经验,并且会很感激一些提示。

PS:我还联系了原始代码的开发者。

1 个答案:

答案 0 :(得分:1)

这个问题很难回答,因为它的根源是这一行:

if($line=~m/<a href="\/nodes\/(\w+)">(\d+)<\/a>/) {

%nodes表示不匹配。猜测一下,那是因为URL格式稍有变化 - 或者可能是在链接中插入换行符,或者......好吧,真的。

匹配:

<a href="/nodes/node1">10</a>

你会得到一个哈希元素:

 node1 => 10

不会匹配:

<a href="/root/nodes/node1">10</a>
<a href="/nodes/node-1">10</a>
<a href="nodes/node1">10</a>
<a href="/nodes/node1">10 </a>
<a href="/nodes/node1">
   10
</a>

<a href="/nodes/node1">node1</a>
<A HREF="/nodes/node1">10</A>

这是为什么基于正则表达式的HTML解析是一个坏主意的原因之一。修复此问题需要查阅源HTML并找到一个匹配的新正则表达式 - 但是没有URL或示例HTML我们无法帮助。

我建议你需要插入:

print $response->decoded_content

看看你在a href中得到了什么。