Perl 5.10+中词汇$ _的好,坏和丑

Eri*_*rom 19 perl global lexical perl5.10

从Perl 5.10开始,现在可以在语义上或在构造中$_明确地对上下文变量进行范围限定.my $_;given / when

有没有人发现词汇的好用$_?它是否使任何构造更简单/更安全/更快?

如果情况变得更复杂呢?词法是否在$_您的代码中引入了任何错误?(因为写入的控制结构$_将使用词法版本,如果它在范围内,如果它包含任何子例程调用(由于动态范围的丢失),这可以改变代码的行为)

最后,我想构建一个清单,明确何时$_用作词汇,全局,或者根本不重要.


注意:由于perl5-5.24这些实验性特征不再是perl的一部分.

dao*_*oad 8

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一起工作,所以我没有$_在大型项目中玩词汇的乐趣.但是,感觉这样做会有很长的路要走,使用$_更安全,这是一件好事.

  • 是什么原因给'for($ foo){...}`而不是`local*_ =\$ foo;`?根据我的经验,后者更快一些(因为它不需要为单个元素列表设置范围和迭代器),但如果有任何安全问题需要记住,我会感兴趣. (2认同)