我有多个正则表达式。我想先将字符串与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上的每个正则表达式并更新哈希值。我怎么能这样做?
答案 0 :(得分: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" );
}