Perl - 检查文件中是否存在IP地址

时间:2017-10-26 16:36:55

标签: perl

我理解这个问题可以归类为常见问题,但我没有找到任何答案。我一直试图在过去几个小时内完成这项任务。

简单方案:

我在变量中有一个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地址值。

有什么想法吗?

1 个答案:

答案 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。它还记录在perlreperlbackslash中。

编辑过的问题有一个明确的方法来获得上述警告。似乎

$domObj->getElementsByTagName('ipv4-address');

没有按预期执行并返回undef(或没有),因此$ipv4保持未定义。

然后在正则表达式中使用(评估)它并得到相应的警告。

另一种可能性是警告实际上是从getElementsByTagName发出的,但您应该能够告诉我,因为警告应该显示触发它的代码行。