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を保存し、それらを異なるアレイに保存する必要があります。したがって、2つのアレイがあります。1つは宛先で、もう1つは到達済みです。これどうやってするの。現時点では、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修飾子は、正規表現と1回だけでなく、文字列に収まる頻度で一致します。詳細については、 perldocperlretutをお読みください

于 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 に答える