Подтвердить что ты не робот

Есть ли способ перекомпилировать регулярное выражение в Perl?

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

4b9b3361

Ответ 1

Для литералов (статических) регулярных выражений нечего делать - 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 будет использовать старое regex. Это может привести к затруднению диагностики ошибок.

Ответ 2

Простой: проверьте оператор qr//(зарегистрированный в perlop под Regexp Quote-Like Operators).

my $regex = qr/foo\d/;
$string =~ $regex;