Среда выполнения регулярных выражений Perl работает намного быстрее при работе с «фиксированными» или «привязанными» подстроками, а не с «плавающими» подстроками.Подстрока фиксируется, когда вы можете заблокировать ее в определенном месте в исходной строке.И '^' и '$' обеспечивают эту привязку.Однако, когда вы используете чередование '|', компилятор не распознает варианты как фиксированные, поэтому он использует менее оптимизированный код для сканирования всей строки.И в конце процесса поиск фиксированных строк дважды намного, намного быстрее, чем поиск плавающей строки один раз.Что касается сопутствующей заметки, то чтение regcomp.c в Perl заставит вас ослепнуть.
Обновление : вот некоторые дополнительные сведения.Вы можете запустить perl с флагом '-Dr', если вы скомпилировали его с поддержкой отладки, и он выведет данные компиляции регулярного выражения.Вот что вы получите:
~# debugperl -Dr -e 's/^\s+//g'
Compiling REx `^\s+'
size 4 Got 36 bytes for offset annotations.
first at 2
synthetic stclass "ANYOF[\11\12\14\15 {unicode_all}]".
1: BOL(2)
2: PLUS(4)
3: SPACE(0)
4: END(0)
stclass "ANYOF[\11\12\14\15 {unicode_all}]" anchored(BOL) minlen 1
# debugperl -Dr -e 's/^\s+|\s+$//g'
Compiling REx `^\s+|\s+$'
size 9 Got 76 bytes for offset annotations.
1: BRANCH(5)
2: BOL(3)
3: PLUS(9)
4: SPACE(0)
5: BRANCH(9)
6: PLUS(8)
7: SPACE(0)
8: EOL(9)
9: END(0)
minlen 1
Обратите внимание на слово «якорь» в первом дампе.