IMO, одна из замечательных вещей, которую можно извлечь из лексики $_
- это новый _
символ-прототип.
Это позволяет вам указать подпрограмму так, чтобы она заняла один скаляр или, если не указано ни одного, получит $_
.
Так что вместо того, чтобы писать:
sub foo {
my $arg = @_ ? shift : $_;
# Do stuff with $_
}
Я могу написать:
sub foo(_) {
my $arg = shift;
# Do stuff with $_ or first arg.
}
Не большое изменение, но это намного проще, когда я хочу такое поведение. Снятие кипятильника - это хорошо.
Конечно, это влияет на изменение прототипов нескольких встроенных функций (например, chr
), что может привести к поломке некоторого кода.
В целом, приветствую лексический $_
. Это дает мне инструмент, который я могу использовать, чтобы ограничить случайное копирование данных и странное взаимодействие между функциями. Если я решу использовать $_
в теле функции, лексизируя ее, я могу быть уверен, что какой бы код я ни вызвал, $_
не будет изменен в вызывающем коде.
Динамический охват интересен, но по большей части я хочу лексическую область видимости. Добавьте к этому осложнения вокруг $_
. Я слышал страшные предупреждения о нецелесообразности простого выполнения local $_;
- что лучше использовать for ( $foo ) { }
вместо этого. Лексизированный $_
дает мне то, что я хочу, 99 раз из 100, когда я локализовал $_
любым способом. Lexical $_
повышает удобство и удобство чтения.
Большая часть моей работы была связана с Perl 5.8, поэтому я не имел удовольствия играть с лексической $_
в более крупных проектах. Однако, кажется, что это сделает долгий путь, чтобы сделать использование $_
более безопасным, и это хорошо.