Есть ли способ предварительно скомпилировать регулярное выражение в Perl? - PullRequest
28 голосов
/ 05 июня 2009

Есть ли способ предварительно скомпилировать регулярное выражение в Perl? У меня есть один, который я использую много раз в программе, и он не меняется между использованиями.

Ответы [ 3 ]

67 голосов
/ 05 июня 2009

Для литеральных (статических) регулярных выражений делать нечего - perl скомпилирует их только один раз.

if ($var =~ /foo|bar/) {
    # ...
}

Для регулярных выражений, хранящихся в переменных, у вас есть несколько вариантов. Вы можете использовать оператор qr// для создания объекта регулярного выражения:

my $re = qr/foo|bar/;

if ($var =~ $re) {
    # ...
}

Это удобно, если вы хотите использовать регулярное выражение в нескольких местах или передать его подпрограммам.

Если шаблон регулярного выражения находится в строке, вы можете использовать параметр /o, чтобы пообещать Perl, что он никогда не изменится:

my $pattern = 'foo|bar';

if ($var =~ /$pattern/o) {
    # ...
}

Обычно лучше этого не делать. Perl достаточно умен, чтобы знать, что переменная не изменилась, и регулярное выражение не нужно перекомпилировать. Указание /o, вероятно, является преждевременной микрооптимизацией. Это также потенциальная ловушка. Если переменная имеет , измененную с помощью /o, то Perl все равно будет использовать старое регулярное выражение. Это может привести к трудностям в диагностике ошибок.

19 голосов
/ 05 июня 2009

Простой: проверьте оператор qr // (задокументировано в perlop в Операторах, похожих на регулярные выражения ).

my $regex = qr/foo\d/;
$string =~ $regex;
0 голосов
/ 16 ноября 2018

для уточнения, вы можете предварительно скомпилировать регулярное выражение как:

my $re = qr/foo|bar/;  #precompile phase
if ( $string =~ $re ) ...   #for direct use
if ( $string =~ /$re/ ) .... #the same as above but a bit complicated
if ( $string =~ m/something $re other/x ) ...  #for use precompiled as a part of bigger regex
if ( $string =~ s/$re/replacement/ ) ...  #for direct use as replace
if ( $string =~ s/some $re other/replacement/x ) ... #for use precompiled as a part of bigger, and as replace all at once

Это задокументировано в perlre, но прямых примеров нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...