Регулярные выражения Perl и их применение

       

Отладочная информация регулярных выражений


Если применить директиву

use re qw(debug);

то Perl будет выдавать подробную отладочную информацию по работе регулярных выражений. Иногда в ней можно найти что-то полезное (скажем, какие методы оптимизации используются или в чем была ваша ошибка). Например, имеем такую программку

use re qw(debug);

'abcd' =~ /abc(d)/;

На печать будет выдано:

Compiling REx `abc(d)' size 9 Got 76 bytes for offset annotations. first at 1 1: EXACT <abc>(3) 3: OPEN1(5) 5: EXACT <d>(7) 7: CLOSE1(9) 9: END(0) anchored `abcd' at 0 (checking anchored) minlen 4 Offsets: [9] 1[3] 0[0] 4[1] 0[0] 5[1] 0[0] 6[1] 0[0] 7[0] Guessing start of match, REx `abc(d)' against `abcd'... Found anchored substr `abcd' at offset 0... Guessed: match at offset 0 Matching REx `abc(d)' against `abcd' Setting an EVAL scope, savestack=3 0 <> <abcd> | 1: EXACT <abc> 3 <abc> <d> | 3: OPEN1 3 <abc> <d> | 5: EXACT <d> 4 <abcd> <v | 7: CLOSE1 4 <abcd> <> | 9: END Match successful! Freeing REx: `"abc(d)"'

Текст

1: EXACT <abc>(3) 3: OPEN1(5) 5: EXACT <d>(7) 7: CLOSE1(9) 9: END(0)

является расшифровкой внутреннего представления регулярного выражения. Например, строка

1: EXACT <abc>(3)

означает, что надо искать строковый литерал abc длиной 3 символа. Строка

anchored `abcd' at 0 (checking anchored) minlen 4

означает, что текст abcd длины 4 привязан к началу регулярного выраения и должен встретиться при любом совпадении. Поэтому, если целевой текст окажется короче этого текста, то Perl не станет применять регулярное выражение, оператор поиска без применения сразу возвратит неудачу. Строка

3: OPEN1(5)

означает, что открылась первая захватывающая скобка, 5 означает номер следующей исполняемой строки псевдокода.



Содержание раздела