0

私は次のコードを作成して、ファイルを読み取り、スラープし、IP アドレスを識別し、ハッシュ構造を使用して各アドレスの出現回数を追跡しました。問題は、キーが正規表現から一致した IP アドレスではなく、IP アドレスが表示される行全体であることです。これを修正するにはどうすればよいですか? (問題は、丸呑みが行ごとに行われるという事実に関係していると思います)

%ipcount;

@fileslurp = <FH>;
foreach(@fileslurp){
    if($_ =~ m/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/){
        $ipcount{$_}++;
    }
}

$numIP = scalar keys %ipcount;

print "Number of unique IP: $numIP \n"; 

foreach $ipaddress (sort { $ipcount{b} <=> $ipcount{a} } keys %ipcount){
    print "$ipaddress: $ipcount{$ipaddress} \n";
}
4

2 に答える 2

1

すでにグループ マッチを行っているようです。ハッシュに追加するときに $_ を $1 に変更してください。

%ipcount;

@fileslurp = <FH>;
foreach(@fileslurp){
    if($_ =~ m/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/){
        $ipcount{$1}++;
    }
}

$numIP = scalar keys %ipcount;

print "Number of unique IP: $numIP \n"; 

foreach $ipaddress (sort keys %ipcount){
    print "$ipaddress: $ipcount{$ipaddress} \n";
}

すべてのperl スクリプトでuse strict;andを使用する習慣を身につけてください。use warnings;問題をキャッチするのに役立ちます。

于 2014-06-17T05:08:13.347 に答える
0

注目してください$ipcount{$_}、ここで使用し$_ている回線は、 キャプチャされた IP アドレスの$ipcount{$1}場所に変更します。$1


もう1つ、IPアドレスを一致させるための正規表現が正しくありません。IP アドレスの照合は、正規表現の複雑さと正確さの間のトレードオフのもう 1 つの良い例です。\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b任意の IP アドレスに問題なく一致999.999.999.999しますが、有効な IP アドレスであるかのように一致します。これが問題になるかどうかは、正規表現を適用するファイルまたはデータによって異なります。IP アドレスの 4 つの数字すべてを に制限するに0..255は、次の正規表現を使用できます。IP アドレスの 4 つの数字のそれぞれをキャプチャ グループに格納します。これらのグループを使用して、IP 番号をさらに処理できます。フリースペース モードでは、これをページの幅に合わせることができます。

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\. (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\. (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\. (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

個々の数値にアクセスする必要がない場合は、量指定子を使用して正規表現を次のように短縮できます。

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3} (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

同様に、クイック正規表現を次のように短縮できます。\b(?:\d{1,3}\.){3}\d{1,3}\b

また、 Regexp::Common のRegexp ::Common::net部分には、必要な正規表現が含まれている場合があります。

于 2014-06-17T05:16:43.073 に答える