Опубликован: 18.06.2007 | Доступ: свободный | Студентов: 1354 / 35 | Оценка: 4.14 / 3.29 | Длительность: 12:44:00
ISBN: 978-5-94774-604-4
Лекция 13:

Компиляция регулярных выражений, модификатор o, функция study, хронометраж

< Лекция 12 || Лекция 13: 1234 || Лекция 14 >

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

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

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 означает номер следующей исполняемой строки псевдокода.

13.3. Функция study

Функция

study( переменная с целевым текстом )

является еще одной возможностью оптимизации использования регулярных выражений.

Эта функция создает в переменной с целевым текстом скрытую информацию о тексте, который содержит эта переменная. Это список позиций, в которых каждый символ встречается в данном тексте. В результате на построение этого списка позиций расходуется время и память, которая обычно превосходит в четыре раза объем памяти для текста этой переменной. Поэтому выигрыша во времени можно не получить вовсе, если применять функцию study не там, где нужно. Функция study может существенно ускорить поиск, если в регулярном выражении имеется литеральный текст, но модификатор i сводит на нет усилия функции study. Также функция study может оказаться полезной, если к одной и той же переменной применяется много операторов с регулярными выражениями или если целевой текст имеет большой объем. При любом присваивании значения переменной, содержащей целевой текст, внутренняя информация, привязанная к этой переменной, становится недействительной.

Для применения оптимизаций, которые возможны с функцией study, надо стараться выделять литеральный текст. Например, вместо

a+

надо написать эквивалентный подшаблон

aa*

а вместо

a{3,6}

нужно записать

aaa{0,3}

Если конструкция выбора ( альтернативный шаблон ) в каждой ветви начинается с одного и того же литерала, то его надо "вынести за скобку" и, к примеру, вместо

that|this

записать

th(?:at|is)
< Лекция 12 || Лекция 13: 1234 || Лекция 14 >
Андрей Колосов
Андрей Колосов
Россия, Севастополь, ЧВВМУ им. П.С. Нахимова, 1989