从Perl 5.10开始,现在可以将上下文变量$ _进行词法范围的显式定义为$ _;或在给定/何时构造。
有没有人发现词汇$ _的好用处?它是否使任何构造更简单/更安全/更快?
那么它会变得更复杂的情况呢?词汇$ _引入了你的代码中的任何错误吗? (因为写入$ _的控制结构将使用词法版本,如果它在范围内,如果它包含任何子例程调用(由于动态范围的丢失),则可以改变代码的行为)
最后,我想构建一个清单,说明何时使用$ _作为词法,作为全局的,或者什么时候没有关系。
注意:从perl5-5.24开始,这些实验功能是no longer part of perl。
解决方法
海事组织,一个伟大的事情来自词汇$ _是新的_原型符号。
这允许您指定一个子例程,以便它将需要一个标量,或者如果没有提供它,它将获取$ _。
所以代替写作:
sub foo { my $arg = @_ ? shift : $_; # Do stuff with $_ }
我可以写:
sub foo(_) { my $arg = shift; # Do stuff with $_ or first arg. }
不是一个很大的变化,但是当我想要这种行为时,这只是简单得多。拆除锅炉是件好事。
当然,这样会改变几个内建(例如chr)的原型,这可能会打破一些代码。
总的来说,我欢迎词汇$ _。它给了我一个工具,我可以用来限制意外的数据暴露和功能之间的离奇的交互。如果我决定在函数体中使用$ _,通过对它进行词法化,我可以确定我所调用的任何代码,$ _不会在调用代码中被修改。
动态范围很有趣,但在大多数情况下,我想要词汇作用域。加上$ _附近的并发症。我听到了关于简单地做本地$ _的不合适性的可怕警告; – 最好使用($ foo){}。词汇化$ _给我我想要的99次,100当我已经本地化$ _无论如何。词汇$ _使非常方便和可读性更加强大。
我的大部分工作都不得不使用perl 5.8,所以我没有在大项目中玩词汇$ _的乐趣。但是,感觉这样会有一个很长的路要走$ _更安全,这是一件好事。