正则表达式模式存储在数组中

时间:2012-11-06 13:24:04

标签: regex perl file-io

我是perl的新手并且想要读取存储IP的文件,我想要grep这些IP并存储在数组中,我能够为此编写正则表达式,但是在三个ips中它始终存储最后一个ip数组中的文件,请帮助我的人,我的代码和文件如下所示。

我的输入文件有以下内容

  

嗨praveen怎么样10.23.54.86

     

10.87.98.65

     

10.98.76.54

我的脚本o / p是

  

/ pearl $ ./par.pl sdp.txt

     

10.98.76.54

和代码是

#!/usr/bin/perl

open (INPUT,$ARGV[0]) || die "Can not open file:$!";

$i=0;

while(<INPUT>)
{
  $line=$_;
  ($arr,$arr1,$arr2)=($line=~m/\d+[\.]\d+[\.]\d+[\.]\d+/g);
}


close(INPUT);

print $arr,"\n";

我尝试使用数组和变量但是相同的结果只能存储最后一个值。

3 个答案:

答案 0 :(得分:2)

当你一次读一行时,每行只有一个地址 当然你只有一个输出,因为输出是在循环后打印的, 在每次迭代中不在其中。

  • 使用<>
  • 避免不必要的变量(如$i
  • 启用警告
  • 您最有可能想使用数组来存储您的IP

在以下代码中,您的IP将存储在@ips

#!/usr/bin/perl

use warnings;
use strict;

my @ips;

while (<>) {
    # not the optimal regex for IPs, I just simplifyied yours
    push @ips, m/(?:\d+\.){3}\d+/g;
}

print "@ips\n";
# --- or ---
print "$_\n" foreach @ips;

答案 1 :(得分:1)

考虑使用Perl模块Regexp::Common来匹配IP,因为它已经很好地为此目的而开发:

use strict;
use warnings;
use Regexp::Common qw/net/;

my @IPs;

while (<>) {
    my ($IP) = /($RE{net}{IPv4})/;
    push @IPs, $IP if $IP;
}

print "$_\n" for @IPs;

数据集的输出:

10.23.54.86
10.87.98.65
10.98.76.54

捕获一行上的有效IP并将其放入$IP。如果push包含@IPs,则下一行$IP将IP转换为@IPs。最后,print的元素是{{1}} ed,如果有的话。

希望这有帮助!

答案 2 :(得分:0)

您似乎有两个问题:

  1. 您似乎填写了3个变量,而不是4个(除非您不想要最后一个数字?)

  2. 您的正则表达式未指定任何捕获组,因此您不会保存匹配字符串中的任何值。

  3. 你想要这样的东西:

    while(<INPUT>)
    {
      if( ($arr,$arr1,$arr2,$arr3) = /(\d+)\.(\d+)\.(\d+)\.(\d+)/g )
      {
        print "$arr $arr1 $arr2 $arr3\n";
      }
    }
    

    或者,如果您想将匹配的数字视为列表,请尝试以下方法:

    while(<>)
    {
      chomp;
      if( @array = /(\d+)\.(\d+)\.(\d+)\.(\d+)/g )
      {
        print @array;
      }
    }