Eri*_*rom 19 perl global lexical perl5.10
从Perl 5.10开始,现在可以在语义上或在构造中$_
明确地对上下文变量进行范围限定.my $_;
given / when
有没有人发现词汇的好用$_
?它是否使任何构造更简单/更安全/更快?
如果情况变得更复杂呢?词法是否在$_
您的代码中引入了任何错误?(因为写入的控制结构$_
将使用词法版本,如果它在范围内,如果它包含任何子例程调用(由于动态范围的丢失),这可以改变代码的行为)
最后,我想构建一个清单,明确何时$_
用作词汇,全局,或者根本不重要.
注意:由于perl5-5.24
这些实验性特征不再是perl的一部分.
IMO,从词法中走出来的一件好事$_
就是新的_
原型符号.
这允许您指定一个子例程,以便它将占用一个标量,或者如果没有提供它将抓取它$_
.
所以不要写:
sub foo {
my $arg = @_ ? shift : $_;
# Do stuff with $_
}
Run Code Online (Sandbox Code Playgroud)
我可以写:
sub foo(_) {
my $arg = shift;
# Do stuff with $_ or first arg.
}
Run Code Online (Sandbox Code Playgroud)
这不是一个很大的改变,但是当我想要这种行为时,它会变得更加简单.拆除锅板是一件好事.
当然,这有可能改变几个内置的原型(例如chr
),这可能会破坏一些代码.
总的来说,我欢迎词汇$_
.它为我提供了一个工具,可以用来限制意外的数据混合和函数之间奇怪的交互.如果我决定$_
在函数体中使用,通过词法化,我可以确定无论我调用什么代码,$_
都不会在调用代码时修改它.
动态范围很有趣,但在大多数情况下我需要词法范围.加上这个并发症$_
.我听到了关于简单做的不可取的可怕警告local $_;
- 最好用它来for ( $foo ) { }
代替.$_
当我$_
通过任何方式进行本地化时,词汇化给了我99次中的100次.Lexical提供$_
了极大的便利性和可读性.
我的大部分工作都必须与perl 5.8一起工作,所以我没有$_
在大型项目中玩词汇的乐趣.但是,感觉这样做会有很长的路要走,使用$_
更安全,这是一件好事.