'o' модификатор для регулярных выражений Perl все еще предоставляют какое-либо преимущество?

ESLint принимает собственные решения о том, что он считает допустимыми или недействительными предупреждениями или ошибками. Вы должны относиться ко всему, что eslint / jslint / jshint говорит как рекомендательное в дополнение ко всему остальному. По словам кого-то, их предложения оптимальны и совершенно правильны.

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

  • Использовать флаги eslint в комментарии в коде
  • Запустите eslint с настройкой, чтобы указать этот флаг
  • Используйте флаг --use-strict при запуске node

Конкретная причина, почему вы получаете это предупреждение, связана с тем, что интерпретатор узла по умолчанию в его нынешнем виде не полностью готов к ES6. Например, в узле 4 вы не можете использовать let вне строгого режима, хотя let является ключевым словом ES6.

38
задан brian d foy 15 February 2009 в 22:26
поделиться

3 ответа

Я уверен, что это все еще поддерживается, но это является в значительной степени устаревшим. Если Вы хотите, чтобы regex был скомпилирован только однажды, Вы - более обеспеченное использование объекта regex, как так:

my $reg = qr/foo$bar/;

Интерполяция $bar сделан, когда переменная инициализируется, таким образом, Вы будете всегда использовать кэшируемый, скомпилированный regex с тех пор в объеме включения. Но иногда Вы хотите, чтобы regex был перекомпилирован, потому что Вы хотите, чтобы он использовал новое значение переменной. Вот является пример Friedl, используемым в Книге:

sub CheckLogfileForToday()
{
  my $today = (qw<Sun Mon Tue Wed Thu Fri Sat>)[(localtime)[6]];

  my $today_regex = qr/^$today:/i; # compiles once per function call

  while (<LOGFILE>) {
    if ($_ =~ $today_regex) {
      ...
    }
  }
}

В рамках функции остается таким же значение $today_regex. Но в следующий раз, когда функция вызвана, regex будет перекомпилирован с новым значением $today. Если он только что использовал

if ($_ =~ m/^$today:/io)

... regex никогда не обновлялся бы. Так, с объектной формой у Вас есть эффективность/o, не жертвуя гибкостью.

37
ответ дан Schwern 27 November 2019 в 03:38
поделиться

/o модификатор находится в документация perlop вместо документация perlre , так как это - подобный кавычке модификатор, а не regex модификатор. Это всегда казалось нечетным мне, но это - то, как это. Начиная с Perl 5.20 это теперь перечислено в perlre просто, чтобы отметить, что Вы, вероятно, не должны использовать его.

Перед Perl 5.6, Perl перекомпилировал бы regex, даже если переменная не изменилась. Вы не должны больше делать этого. Вы могли использовать /o для компиляции regex однажды несмотря на дальнейшие изменения в переменной, но как другие отмеченные ответы, qr// лучше для этого.

17
ответ дан brian d foy 10 October 2019 в 07:29
поделиться

Это - оптимизация в случае, что regex включает ссылку на переменную. Это указывает, что regex не изменяется даже при том, что это имеет переменную в нем. Это допускает оптимизацию, которая не была бы возможна иначе.

4
ответ дан denis phillips 10 October 2019 в 07:29
поделиться
Другие вопросы по тегам:

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