IMO,从词汇中出来的一件好事$_
是新的_
原型符号。
这允许您指定一个子例程,以便它采用一个标量,或者如果没有提供它将抓取$_
。
所以不要写:
sub foo {
my $arg = @_ ? shift : $_;
# Do stuff with $_
}
我可以写:
sub foo(_) {
my $arg = shift;
# Do stuff with $_ or first arg.
}
变化不大,但是当我想要这种行为时,它就简单多了。样板删除是一件好事。
当然,这会产生改变几个内置函数(例如chr
)原型的连锁反应,这可能会破坏一些代码。
总的来说,我欢迎 lexical $_
。它给了我一个工具,我可以用它来限制意外的数据修改和函数之间的奇怪交互。如果我决定$_
在函数体中使用,通过词法化它,我可以确保我调用的任何代码$_
都不会在调用代码中被修改。
动态范围很有趣,但在大多数情况下,我想要词法范围。再加上周围的并发症$_
。我听说过关于简单地做的不可取的可怕警告local $_;
——最好for ( $foo ) { }
改用它。当我通过任何方式进行本地化时, Lexicalized$_
给了我 100 次中的 99 次我想要$_
的东西。Lexical$_
使极大的便利性和可读性功能更加健壮。
我的大部分工作都必须使用 perl 5.8,所以我没有$_
在大型项目中使用 lexical 的乐趣。但是,感觉这将大大有助于使使用$_
更安全,这是一件好事。