我理解这个问题可以归类为常见问题,但我没有找到任何答案。我一直试图在过去几个小时内完成这项任务。
简单方案:
我在变量中有一个IP地址,我想检查文件中是否存在IP地址(包含IP地址列表)。
以下是我的代码部分:
use strict;
use warnings;
my $list = "IP addresses: ";
my $ipv4 = $domObj->getElementsByTagName('ipv4-address');
open my $fh, '<' , 'sample.txt';
while(<$fh>)
{
if(/\b$ipv4\b/)
{
$list .= $ipv4;
print "IP address found!!";
}
}
当我运行上面的代码时,它会向我显示一些未初始化的变量错误。它找不到$ipv4
文件中sample.txt
更正中的IP地址值。
有什么想法吗?
答案 0 :(得分:2)
(已编辑)问题中的警告只能归于$domObj
,请参阅结束。我们无法解决这个问题。
但是显示的代码中也存在直接错误,所以让我们清楚一点。
您的IPv4地址包含.
,在正则表达式中使用时非常特殊。因此,当您使用$ipv4
作为正则表达式中的模式时,.
匹配任何字符,整个事情都是错误的。 (它仍然应该与文字.
匹配,但它也允许其他字符。)
使用quotemeta形成正则表达式模式,它会转义所有非单词字符
my $re_ipv4 = quotemeta $ivp4;
my @list;
while (<$fh>)
{
while (/\b($re_ipv4)\b/g) {
push @list, $1;
}
}
我将它们放在一个数组中,稍后您可以在字符串中join
。如果您希望直接形成字符串,请记住添加空格$list .= "$1 "
在正则表达式中,\Q
(和\E
会阻止它)
/\b\Q($ipv4)\E\b/
搜索\Q
in perlop。它还记录在perlre和perlbackslash中。
编辑过的问题有一个明确的方法来获得上述警告。似乎
$domObj->getElementsByTagName('ipv4-address');
没有按预期执行并返回undef
(或没有),因此$ipv4
保持未定义。
然后在正则表达式中使用(评估)它并得到相应的警告。
另一种可能性是警告实际上是从getElementsByTagName
发出的,但您应该能够告诉我,因为警告应该显示触发它的代码行。