Регулярный ленивый квантификатор и класс отрицания в источнике MarkDown - PullRequest
2 голосов
/ 11 ноября 2010

Я просматриваю код MarkDown , написанный на Perl Джоном Грубером, и есть подпрограмма под названием _Detab, которая преобразует символы табуляции в пробелы, сохраняя отступ текста. Строка кода в вопросе 1314 в Markdown.pl:

$text =~ s{(.*?)\t}{$1.(' ' x ($g_tab_width - length($1) % $g_tab_width))}ge;

Не приведет ли это к ненужному возвращению назад? Разве следующий шаблон не будет работать более эффективно?

/([^\t\n]*)\t/

Или я что-то упустил? Благодаря.

Кстати, я только отрицаю \n, а не \r, потому что все разрывы строк заранее стандартизированы до \n.

Ответы [ 2 ]

5 голосов
/ 12 ноября 2010

Не угадайте, когда вы сможете сделать бенчмарк:

use Benchmark 'cmpthese';

my $source = "\t\thello\n\t\t\tworld\n" x 100;
my $g_tab_width = 8;

my ($textU, $textN);

cmpthese(-3, {
  ungreedy => sub {
    $textU = $source;
    $textU =~ s{(.*?)\t}{$1.(' ' x ($g_tab_width - length($1) % $g_tab_width))}ge;
  },

 negated => sub {
    $textN = $source;
    $textN =~ s{([^\n\t]*)\t}{$1.(' ' x ($g_tab_width - length($1) % $g_tab_width))}ge;
  },
});

die "whoops" unless $textN eq $textU; # ensure they do the same thing

Я обнаружил, что не жадная версия (как она выглядит в источнике Markdown) примерно на 40% быстрее, чем предложенный вами класс отрицательных символов:

           Rate  negated ungreedy
negated  1204/s       --     -30%
ungreedy 1718/s      43%       --

Я думаю, что сопоставление . более эффективно, чем класс отрицательных символов, что компенсирует дополнительный возврат.Для подтверждения этого потребуется больше тестов.

1 голос
/ 12 ноября 2010

Вы правы. Это может привести к ненужному возврату. Да, ваш шаблон будет более эффективным.

Большинство людей на самом деле не понимают и не думают о том, как работают регулярные выражения, и / или просто делают то, что им преподавали. Я не знаю подробностей этого кода или автора, но это очень распространенное регулярное выражение, которое вы увидите в коде perl.

И, честно говоря, для большинства случаев использования это не имеет большого значения.

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