0

複数の正規表現があります。最初に文字列を regex1 と一致させ、一致しない場合は regex2 と一致させたいと考えています。一致するたびに、共通のハッシュを値で更新したいと考えています。

$str = "%v:%{local}p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %D";
@regex = ( /\%\{[\-\w]+\}\w/g , /\%\w+/g ); 

str のそれぞれの正規表現を照合し、ハッシュを更新したいと考えています。これどうやってするの?

4

1 に答える 1

1

一般的なハッシュが何であるか、またはキャプチャしたい正規表現の部分がわからない場合、私が提案できるのは、一致するまで各正規表現を一度に 1 つずつテストする方法だけです。それらをループに入れてlast、一致が見つかったらキーワードを使用してループを中止します。


$str = "%v:%{local}p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %D";
@regexes = ( qr/\%\{[\-\w]+\}\w/g , qr/\%\w+/g );

foreach my $regex ( @regexes ) {
    if ( $str =~ $regex ) {
        # update hash here
        ...
        last; # exit loop
    }
}

あなたが何をキャプチャしたいのか推測しなければならない場合は、私の頭に銃を向けてください。次のことをお勧めします。


$str = "%v:%{local}p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %D";
@regexes = ( qr/\%\{([\-\w]+)\}\w/g , qr/\%(\w+)/g );

my %words = ();

foreach my $regex ( @regexes ) {
    if ( $str =~ $regex ) {
        # update hash here
        my $word = $1;
        $words{$word}++;
        last; # exit loop
    }
}

# print out words found
foreach my $word ( sort keys %words ) {
    print( "$word\n" );
}
于 2013-07-08T12:24:29.843 に答える