Ответ на этот вопрос зависит от того, содержит ли ваш шаблон какие-либо переменные.Если это не так, Perl уже достаточно умен, чтобы создавать RE только один раз, если он везде одинаков.
Теперь, если вы используете переменные, тогда ответ @ Tanktalus близок, но добавляет ненужную сложность,путем компиляции RE дополнительное время.
Используйте это:
my @matches;
push @matches, $text1 =~ /((?:i)my pattern with a $variable)/o;
push @matches, $text2 =~ /((?:i)my pattern with a $variable)/o;
push @matches, $textn =~ /((?:i)my pattern with a $variable)/o;
Почему?
Используя переменную в шаблоне RE, perl вынужден перекомпилироватьдля каждого случая, даже если эта переменная является предварительно скомпилированным RE, как в ответе @ Tanktalus./o
гарантирует, что он компилируется только один раз, в первый раз, когда он встречается, но он все равно должен быть скомпилирован один раз для каждого вхождения в коде.Это потому, что Perl не может узнать, изменился ли $ pattern между различными вариантами использования.
Другие соображения
На практике, как сказал @Tanktalus, я подозреваю, что это большой примерпреждевременная оптимизация./o
/ имеет значение только тогда, когда ваш шаблон содержит переменные (в противном случае Perl достаточно умен, чтобы в любом случае компилироваться только один раз!)
Гораздо более полезная причина использовать предварительно скомпилированный RE, как предложил @Tanktalus, состоит в том, чтобыулучшить читаемость кода.Если у вас большой волосатый RE, то использование $ pattern везде значительно улучшит читабельность, и с минимальными затратами на производительность (которую вы вряд ли когда-либо заметите).
Заключение
Просто используйте /o
для ваших RE, если они содержат переменные (если вам не нужны переменные для изменения RE при каждом запуске), и не беспокойтесь об этом в противном случае.