Запрет сброса позиции \G модификатором c
Мы можем запретить сброс позиции \G в начало текста, если совпадение не было найдено.
Для этого имеется модификатор c. Он не применяется без модификатора g, поэтому gc является идиомой, как бы одним модификатором gc, хотя модификаторы могут записываться в любом порядке и даже повторяться, что не влечет каких-лидо последствий (за исключением повтора модификатора e в операторе подстановки s///).
Вот как выглядит последний пример с использованием модификатора c:
$_='abcd'; while (/(\w)/gc) { print "$1 " } my @a=/\w/g; print "\n".scalar @a;
Напечатается следующее:
a b c d 0
Мы видим, что второй поиск завершился неудачей, и размер массива @a равен нулю.
Аналогично работает и предпоследний пример:
$_='abcd'; my @a=/\w/gc; print "@a\n"; if (/\w/g) { print "Found $1" } else { print 'Not found' }
Будет напечатано:
a b c d Not found
Если бы мы распечатали значение функции pos($_) после исчерпывающего поиска с модификатором gc, то pos указывала бы в конец строки (в нашем случае это 4). После исчерпывающего поиска с одним модификатором g, когда \G сбрасывается в начало текста, значение pos($_) становится неопределенным, как и для любой переменной, для которой не выполнялся поиск с модификатором g, или после присвоения этой переменной значения.