Как отследить выполнение соответствия регулярному выражению?
Есть ли удобный способ получить трассировку состояний движка регулярных выражений во время оценки 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]+"