Как отследить выполнение соответствия регулярному выражению?

Есть ли удобный способ получить трассировку состояний движка регулярных выражений во время оценки m// или же s/// выражение?


Кстати, я знаю, что есть пакет Regexp::Debugger, доступный через CPAN (и это удивительно круто), но я не вижу способа получить что-либо подобное от него; Я не хочу проходить потенциально огромное количество шагов.

1 ответ

Решение

Да. Переведите механизм регулярных выражений в режим отладки, и он напечатает, что он делает:

use re 'debug'; 

my $str = "abcdefg";
$str =~ m/[ef]+/;

Который дает вывод:

Compiling REx "[ef]+"
Final program:
   1: PLUS (13)
   2:   ANYOF[ef] (0)
  13: END (0)
stclass ANYOF[ef] plus minlen 1 
Matching REx "[ef]+" against "abcdefg"
Matching stclass ANYOF[ef] against "abcdefg" (7 bytes)
   4 <abcd> <efg>            |  1:PLUS(13)
                                  ANYOF[ef] can match 2 times out of 2147483647...
   6 <abcdef> <g>            | 13:  END(0)
Match successful!
Freeing REx: "[ef]+"
Другие вопросы по тегам