1

我是 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";

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

4

3 回答 3

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;
于 2012-11-06T13:43:31.520 回答
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. 下一行pushes 一个 IP 到@IPsif$IP包含一个。最后,如果有的话,@IPs会编辑 的元素。print

希望这可以帮助!

于 2012-11-06T16:41:33.033 回答
0

您似乎有两个问题:

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

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

你想要这样的东西:

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;
  }
}
于 2012-11-06T13:36:25.677 回答