我是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";
我尝试使用数组和变量但是相同的结果只能存储最后一个值。
答案 0 :(得分:2)
当你一次读一行时,每行只有一个地址 当然你只有一个输出,因为输出是在循环后打印的, 在每次迭代中不在其中。
<>
$i
)在以下代码中,您的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)
您似乎有两个问题:
您似乎填写了3个变量,而不是4个(除非您不想要最后一个数字?)
您的正则表达式未指定任何捕获组,因此您不会保存匹配字符串中的任何值。
你想要这样的东西:
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;
}
}