Возвращение оператора сопоставления зависит от контекста: в контексте списка он возвращает все захваченные совпадения, в скалярном контексте - true / false. say
накладывает контекст списка, но в первом примере в регулярном выражении ничего не фиксируется, поэтому вы получаете только «success».
Далее, поведение модификатора /g
также отличается в зависимости от контекста. В контексте списка, при этом строка продолжает сканироваться с заданным шаблоном, пока не будут найдены все совпадения, и не будет возвращен список с ними. Это ваши второй и третий примеры.
Но в скалярном контексте его поведение немного специфично: с ним поиск будет продолжен с позиции последнего совпадения, следующего раунда. Одно из типичных применений в состоянии цикла
while (/(\w+)/g) { ... }
Это что-то вроде токенизатора: после запуска тела цикла будет найдено следующее слово и т. Д.
Тогда последний пример на самом деле не имеет смысла; вы получаете «нормальное» совпадение скалярного контекста: успех / неудача, и /g
ничего не делает - пока вы не совпадете с $ss
в следующий раз
perl -wE'
$s=shift||q(abc);
for (1..2) { $m = $s=~/(.)/g; say "$m: $1"; }
'
печатает строки 1:a
, а затем 1:b
.
За пределами итеративных структур (например, while
условие) /g
в скалярном контексте обычно является ошибкой, в лучшем случае бессмысленной или тихой ошибкой.
См. " Глобальное соответствие " в разделе "Использование регулярных выражений" в perlretut для /g
.
См. операторы регулярных выражений в perlop в целом и около /g
. Полезный инструмент для изучения /g
работает: pos .