Существует ли способ предварительно скомпилировать regex в Perl?

Для проверки контроллера

  1. Связка Exec Rake Spec: контроллеры

Для испытания модели

  1. Связка Exec Rake Spec: модели

Для всех тестов

  1. bundle exec rake spec

Для тестирования конкретного файла выполните

  1. rspec file_name_spec.rb (пример спецификации rspec / controllers / groups_controller_spec.rb)
29
задан brian d foy 4 June 2009 в 21:28
поделиться

2 ответа

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

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

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

my $re = qr/foo|bar/;

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

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

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

my $pattern = 'foo|bar';

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

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

68
ответ дан 28 November 2019 в 00:49
поделиться

Просто: проверьте оператор qr // (описанный в perlop в разделе Операторы, подобные кавычкам Regexp ).

my $regex = qr/foo\d/;
$string =~ $regex;
19
ответ дан 28 November 2019 в 00:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: