От ответа perlfaq6 на Как эффективно сопоставить много регулярных выражений одновременно? , в данном случае это последняя версия разработки, которую я только что обновил, с примером умного сопоставления.
Как эффективно сопоставить много регулярных выражений одновременно?
(предоставлено Брайаном Д Фой)
Если у вас есть Perl 5.10 или более поздняя версия, это почтитривиальный.Вы просто умно сопоставляете массив объектов регулярного выражения:
my @patterns = ( qr/Fr.d/, qr/B.rn.y/, qr/W.lm./ );
if( $string ~~ @patterns ) {
...
};
Умное сопоставление прекращается, когда оно находит совпадение, поэтому ему не нужно пробовать каждое выражение.
Ранее, чемPerl 5.10, у вас есть немного работы.Вы хотите избегать компиляции регулярного выражения каждый раз, когда хотите его сопоставить.В этом примере perl должен перекомпилировать регулярное выражение для каждой итерации цикла C, поскольку он не может знать, каким будет C:
my @patterns = qw( foo bar baz );
LINE: while( <DATA> ) {
foreach $pattern ( @patterns ) {
if( /\b$pattern\b/i ) {
print;
next LINE;
}
}
}
Оператор C появился в perl 5.005.Он компилирует регулярное выражение, но не применяет его.Когда вы используете предварительно скомпилированную версию регулярного выражения, Perl выполняет меньше работы.В этом примере я вставил C, чтобы превратить каждый шаблон в его предварительно скомпилированную форму.Остальная часть сценария такая же, но быстрее:
my @patterns = map { qr/\b$_\b/i } qw( foo bar baz );
LINE: while( <> ) {
foreach $pattern ( @patterns ) {
if( /$pattern/ )
{
print;
next LINE;
}
}
}
В некоторых случаях вы можете сделать несколько шаблонов в одном регулярном выражении.Остерегайтесь ситуаций, требующих возврата назад.
my $regex = join '|', qw( foo bar baz );
LINE: while( <> ) {
print if /\b(?:$regex)\b/i;
}
Подробнее об эффективности регулярных выражений см. I by Jeffrey Freidl.Он объясняет, как работает механизм регулярных выражений и почему некоторые шаблоны удивительно неэффективны.Как только вы поймете, как Perl применяет регулярные выражения, вы можете настроить их для отдельных ситуаций.