Как вы понимаете вывод re.pm, когда включена отладка? - PullRequest
3 голосов
/ 21 июля 2011
[root@ test]# perl -e 'use re "debug";"a" =~ /.*/';
Compiling REx `.*'
size 3 Got 28 bytes for offset annotations.
first at 2
   1: STAR(3)
   2:   REG_ANY(0)
   3: END(0)
anchored(MBOL) implicit minlen 0 
Offsets: [3]
    2[1] 1[1] 3[0] 
Matching REx ".*" against "a"
  Setting an EVAL scope, savestack=3
   0 <> <a>               |  1:  STAR
                           REG_ANY can match 1 times out of 2147483647...
  Setting an EVAL scope, savestack=3
   1 <a> <>               |  3:    END
Match successful!
Freeing REx: `".*"'`

Кто-нибудь может интерпретировать это?

1 Ответ

6 голосов
/ 21 июля 2011

Вывод состоит из двух важных частей: компиляция шаблона и сопоставление во время выполнения.

Первая часть описывает узлы, из которых три, в скомпилированном автомате.

  • STAR(n) соответствует нулю или более следующих узлов и продолжается через узел n .
  • REG_ANY соответствует любому символу, кроме новой строки (, т.е. , /./)
  • END отмечает конечное состояние автомата.

MBOL соответствует началу строки в режиме многострочного соответствия, , т.е. , /^/m. Это неявно из-за .* в начале вашего паттерна. (Помните: квантификаторы регулярных выражений по умолчанию жадные.)

Минимальная длина строки, которая может соответствовать вашему шаблону, равна нулю или пустой строке. (Помните: * квантификатор всегда завершается успешно!)

Смещения имеют вид

NODENUM:POSITION[LENGTH]

и свяжите узлы с регулярным выражением в вашей программе. В вашем случае .* (узлы 2 и 1) начинается с первой позиции в вашем шаблоне, и конечное состояние там неявно. Удобные смещения для отладчиков регулярных выражений, , например, , для выделения того, какой подшаблон в настоящее время пытается найти соответствие.

Теперь, когда он скомпилирован, его можно сопоставить, и последняя часть отслеживает выполнение. В разделе Pragmas and Debugging документации perlretut поясняется форма строк, описывающих ход матча:

Каждый шаг имеет форму n <x> <y>, с <x> соответствующей частью строки и <y> частью, еще не соответствующей.

Соответствие в вашем вопросе начинается без использованного текста, затем .* соответствует a, и шаблон соответствует успешно.

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

Раздел Отладка регулярных выражений документации perldebguts предоставляет дополнительную справочную информацию и, как всегда, использует источник, Люк!

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