代码之家  ›  专栏  ›  技术社区  ›  Bala Krishnan

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

  •  -1
  • Bala Krishnan  · 技术社区  · 6 年前

    我知道这个问题可以归类为一个常见问题,但我没有找到任何关于我的具体场景的答案。在过去的几个小时里,我一直在努力完成这件事。

    简单场景:

    我在一个变量中有一个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!!";
        }
    }
    

    当我运行上面的代码时,它显示了一些未初始化的变量错误。在中找不到IP地址值 $ipv4 修正自 sample.txt 文件

    有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   zdim    6 年前

    (已编辑)问题中的警告只能是由于 $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 但是你应该能够分辨出来,因为警告应该显示触发它的代码行。