代码之家  ›  专栏  ›  技术社区  ›  Eric Strom

Perl5.10中词法$的优点、缺点和缺点+

  •  19
  • Eric Strom  · 技术社区  · 14 年前

    从Perl5.10开始,现在可以在词汇上限定上下文变量的范围 $_ ,或显式为 my $_; 或者在一个 given / when 构造。

    有人发现这个词的用法很好吗 $_

    $_ 将使用词法版本,如果它在范围内,这可能会改变代码的行为,如果它包含任何子例程调用(由于动态范围丢失))

    最后,我想建立一个列表,明确何时使用 $_ 作为一个词汇,作为一个全局,或者当它根本不重要的时候。


    注意: perl5-5.24 no longer part of perl .

    4 回复  |  直到 8 年前
        1
  •  8
  •   daotoad    14 年前

    在我看来,这是一件很好的事情 $_ 是新的吗 _ 原型符号。

    $_ .

    所以与其写:

    sub foo {
        my $arg = @_ ? shift : $_;
    
        # Do stuff with $_
    }
    

    sub foo(_) {
        my $arg = shift;
    
        # Do stuff with $_ or first arg.
    }
    

    没什么大的改变,但当我想要那种行为的时候就简单多了。去除样板是件好事。

    当然,这会产生连锁反应,改变几个内置的原型(例如 chr ),这可能会破坏某些代码。

    总的来说,我欢迎你 $_ . 它给了我一个工具,我可以用它来限制意外的数据消耗和函数之间奇怪的交互。如果我决定使用 $_ 在函数体中,通过对其进行词汇化,我可以确定无论调用什么代码,

    . 我听到过一些可怕的警告,说简单地做是不明智的 local $_; --最好使用 for ( $foo ) { } 当我完成本地化时,100次中有99次给了我想要的 $_ 无论如何。词法 $_ 使一个非常方便和可读的特性更加健壮。

    $_ $_

        2
  •  3
  •   mob    14 年前

    我曾经发现一个 issue (虫子这个词太重了)当我和 Inline 模块。这个简单的脚本:

    use strict qw(vars subs);
    for ('function') {
        $_->();
    }
    sub function {
      require Inline;
      Inline->bind(C => <<'__CODE__');
    void foo() 
    {
    }
    __CODE__
    }
    

    失败与 Modification of a read-only value attempted at /usr/lib/perl5/site_perl/5.10/Inline/C.pm line 380. 错误消息。深藏在 内联 模块是要修改的子例程 $_

    使用

    for my $_ ('function') { ...
    

    或以其他方式宣布 my $_ 是解决这个问题的可行方法。

    (The) 模块已修补以修复此特定问题)。

        3
  •  1
  •   G. Cito Marc    9 年前

    [ 一个简短的附加答案,为可能路过的perl新手提供了一个简短的总结。搜索“perl词法主题”时,可以在此处结束。]

    到现在(2015年),我认为词汇话题的引入是一个常识( my $_ 和一些相关的特征)导致了一些在一开始就很难发现的非预期行为 marked 作为 experimental 然后进入了一个 deprecation stage


    部分汇总 #RT119315 : 一个建议是 use feature 'lextopic'; to make use of a new lexical topic variable: $^_ 另一个观点是 implicit name for the topicalizing operator ... other than $_ 例如 map lmap given/when 不清楚。在实验和折旧阶段的来世中,也许有些东西最终会生活在CPAN河中。

        4
  •  0
  •   TerryP    14 年前

    在这里没有任何问题,尽管我倾向于遵循“不问,不说”的政策,当谈到帕尔斯魔术。也就是说,程序不是 通常 期望依靠同龄人篡改非词汇数据作为副作用,也不让他们这样做。