1

我有一个文本文件,它由不同的行组成,看起来像

Destination|203.190.242.69|reached|203.190.244.6
Destination|208.109.249.198|reached|212.142.1.1
Destination|94.75.253.170|reached|85.17.100.90
Destination|212.112.234.228|reached|4.69.143.210
Destination|80.146.246.42|reached|192.168.1.1
Destination|122.209.193.217|reached|59.128.3.65
Destination|66.77.197.179|reached|66.77.197.251
Destination|195.254.227.65|reached|213.21.128.141
Destination|125.208.8.253|reached|125.208.15.254

我需要保存两个 IP 并将它们保存在不同的数组中。所以会有两个数组,一个是Destination,一个是reached。我怎样才能做到这一点。目前我已经编写了一个代码来检测IP,但这似乎不起作用。

while (my $line = <$in>) {
    my $traceroute;
    if ($line =~ /(^Destination)/) {
        print "DUDE\n";
        my $ip = $line =~ /(\d+\.\d+\.\d+\.\d+)$/s;
        #$traceroute = $2;
        print "$ip\n";
    }
}
4

4 回答 4

2

这应该可以解决问题:

while (my $line = <DATA>) {
    if($line =~ /(^Destination)/){
        my($dest, $reach) = $line =~ /(\d+\.\d+\.\d+\.\d+)/g;
        print "$dest $reach\n";
    }
}

__DATA__
Destination|203.190.242.69|reached|203.190.244.6
Destination|208.109.249.198|reached|212.142.1.1
Destination|94.75.253.170|reached|85.17.100.90
Destination|212.112.234.228|reached|4.69.143.210
Destination|80.146.246.42|reached|192.168.1.1
Destination|122.209.193.217|reached|59.128.3.65
Destination|66.77.197.179|reached|66.77.197.251
Destination|195.254.227.65|reached|213.21.128.141
Destination|125.208.8.253|reached|125.208.15.254

在标量上下文中执行正则表达式,只返回成功匹配的数量或者0如果它失败。将 RegEx 的结果分配给数组或变量列表会将其置于列表上下文中,RegEx 在其中返回捕获的值。/g 修饰符不仅匹配 RegEx 一次,而且匹配字符串的频率。阅读perldoc perlretut了解更多

于 2012-08-15T09:27:28.423 回答
2

由于您想将地址保存在数组中,而以前的解决方案都没有明确这样做,所以我发布了另一个答案:

use strict;

my (@destination, @reached);
foreach my $line (<DATA>) {
    chomp $line;
    my @fields = split '\|', $line;
    push @destination, $fields[1];
    push @reached, $fields[3];
}

use Data::Dumper;
print "Destinations:\n".Dumper(@destination);
print "Reached:\n".Dumper(@reached);

__DATA__
Destination|203.190.242.69|reached|203.190.244.6
Destination|208.109.249.198|reached|212.142.1.1
Destination|94.75.253.170|reached|85.17.100.90
Destination|212.112.234.228|reached|4.69.143.210
Destination|80.146.246.42|reached|192.168.1.1
Destination|122.209.193.217|reached|59.128.3.65
Destination|66.77.197.179|reached|66.77.197.251
Destination|195.254.227.65|reached|213.21.128.141
Destination|125.208.8.253|reached|125.208.15.254
于 2012-08-15T09:37:42.423 回答
1

在分隔符上拆分并将项目保存在索引 1 和 3 处。

perl -aF'\|' -lne 'next unless $F[0] eq "Destination"; print "$F[1]|$F[3]"' input >output

当然,您可能想要不同的输出格式和/或做更多的事情。

于 2012-08-15T09:26:49.077 回答
0
while (my $line = <$in>) {
    chomp $line;
    if ($line =~ /^Destination\|(\d+\.\d+\.\d+\.\d+)\|reached\|(\d+\.\d+\.\d+\.\d+)$/) {
        my ($d, $r) = ($1,$2);
        print "$d => $r\n";
    }
}
于 2012-08-15T09:24:22.890 回答