Если совпадение при захвате не удается, $ 1 может все еще содержать значение; значение последнего успешного захвата совпадения в той же динамической области, возможно, из некоторого другого предыдущего регулярного выражения. Похоже, что автор не хотел, чтобы неудачное совпадение оставляло значение в $ 1 из предыдущего регулярного выражения. Чтобы предотвратить это, он принудил захватить матч «всегда удастся», и ничто не было указано в паренях. Это означает, что будет совпадение и захват пустой строки. Другими словами, $ 1 теперь будет пустым, вместо того, чтобы содержать значение совпадения из некоторого предыдущего успешного совпадения.
Более распространенная идиома - это просто проверить успешность сопоставления перед выполнением любого кода, который будет полагаться на значение $ 1, например:
if( /(match)/ ) {
say $1;
}
Несмотря на то, что это часто самый простой подход, к сожалению, код иногда бывает непростым, и принудительное выполнение этого теста в некотором сложном коде может усложнить сложный раздел. В таком случае может быть проще убедиться, что $ 1 не содержит ничего после неудачного совпадения, чем то, что содержалось до неудачного совпадения.
Я действительно думаю, что это хороший вопрос. Найти документацию о поведении # $ 1 после неудачного сопоставления нелегко в Perl POD. Я считаю, что более подробное объяснение можно найти либо в книге верблюдов, либо в книге лам Но сейчас у меня их нет под рукой, чтобы проверить.