Привет!
Читаю книжецу Фридла. Там выражение. Hе могу вкурить результаты его
работы.
Без ? в конструкции (44\d\d\d) оно захватывает в массив фрагменты из 5-
ти цифр начинающиеся с 44, а заодно, в конце строки из-за смещения
поиска забирает неверный фрагмент 44712. Там написано, что если
добавить ? к (44\d\d\d), то выражение работать не будет. Пытаюсь
разобраться. Оно вроде и работает (находит нужные 2 фрагмента), но
совершенно не понятно определяет их в массив.
$_ = '012342345644567345675678944789123458765447120';
@zips = m/(?:\d\d\d\d\d)*?(44\d\d\d)?/g;
print $zips[3], " and ", $zips[7], " and ", @zips,"\n";
результат: 44567 and 44789 and
4456744789
Получается, что совпадают 2 фрагмента и пишутся в 4-й и 8-й элементы
массива. Hе могу понять, почему именно так происходит.
Я считал, что выражение совпадет сразу в первой позиции (перед нулем),
ибо необязательны обе конструкции ()*? и ()?, и в $zips[0] будет
пустое значение. Затем из-за /g произойдет смена позиции поиска в
строке и выражение совпадет в позиции перед 1 (в $zips[1] пустое
значение). И так далее, пока поиск не дойдет до 44567 которые
совпадут с (44\d\d\d)?. Hо эта подстрока, по-моему, должна была
сохраниться в $zips[10]??? И далее, тем же макаром, 44789 в zips[21] и
44712 в zips[31].
Hа деле же, смещение происходит не так как я думал.
Кто-нибудь может объяснить работу этого выражения?
Спасибо!