空哈希和 'Use of uninitialized value in numeric ge (>=)'
Empty hash and 'Use of uninitialized value in numeric ge (>=)'
我对在 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 }
我将它固定到上面定义的哈希 %nodes:
# 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{} = ;
}
}
#Gather perfomance data
foreach my $interest(@interests) {
$np->add_perfdata(
label => $interest,
value => defined($nodes{$interest}) ? $nodes{$interest} : 0,
uom => undef,
);
}
我使用了现有脚本中的那部分。
当我在脚本中的任何地方打印 %nodes 的内容时,我得到一个空行。
我对 perl 不是很有经验,希望得到一些提示。
PS:我也联系了原代码的开发者
这个问题很难回答,因为它的根源是这一行:
if($line=~m/<a href="\/nodes\/(\w+)">(\d+)<\/a>/) {
空 %nodes
表示不匹配。猜测是因为 URL 格式略有变化 - 或者可能在 link 中插入了一个换行符或者......好吧,真的是任何东西。
它将匹配:
<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
中得到了什么。
我对在 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 }
我将它固定到上面定义的哈希 %nodes:
# 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{} = ;
}
}
#Gather perfomance data
foreach my $interest(@interests) {
$np->add_perfdata(
label => $interest,
value => defined($nodes{$interest}) ? $nodes{$interest} : 0,
uom => undef,
);
}
我使用了现有脚本中的那部分。 当我在脚本中的任何地方打印 %nodes 的内容时,我得到一个空行。
我对 perl 不是很有经验,希望得到一些提示。
PS:我也联系了原代码的开发者
这个问题很难回答,因为它的根源是这一行:
if($line=~m/<a href="\/nodes\/(\w+)">(\d+)<\/a>/) {
空 %nodes
表示不匹配。猜测是因为 URL 格式略有变化 - 或者可能在 link 中插入了一个换行符或者......好吧,真的是任何东西。
它将匹配:
<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
中得到了什么。