【问题标题】:Perl - Differences in BEGIN an non-BEGIN blockPerl - BEGIN 非 BEGIN 块的差异
【发布时间】:2012-04-27 11:22:47
【问题描述】:

我对 perl 中的 const 声明有疑问, 并且无法弄清楚差异,请 指出有什么不同。

下面是代码:

BEGIN {
  *SIZE = sub() { 2 };
}  
*ITEM = sub() { 10 };

print 'size=', SIZE, "\n";
print 'item=', &ITEM, "\n";

现在的问题是, 为什么

  print 'item=', &ITEM, "\n";

行必须在ITEM前面有一个'&', 但是

  print 'size=', SIZE, "\n";   

行不需要在 SIZE 前面有一个 '&'。

而且我知道 BEGIN 块是在编译时运行的。

【问题讨论】:

    标签: perl


    【解决方案1】:

    因为 BEGIN 块是在编译时运行的,所以编译器知道对 *SIZE 的赋值,而对 *ITEM 的赋值尚未发生。

    因为编译器不知道*ITEM,所以对ITEM 的调用是不明确的,因此您必须在其前面加上&。否则,编译器会认为它可能是一个“裸词”——一个未加引号的字符串。

    如果你use strict,编译将假定裸词是函数。

    use constant 也可能是声明常量的更好方法,而不是手动进行。

    【讨论】:

      【解决方案2】:

      代码

      BEGIN {
        *SIZE = sub() { 2 };
      }  
      *ITEM = sub() { 10 };
      
      print 'size=', SIZE, "\n";
      print 'item=', ITEM, "\n";
      

      如果没有错误会如下处理:

      • 编译文件。
        • 编译BEGIN 块。
          • *SIZE = sub() { 2 };
        • 执行BEGIN 块。
          • *SIZE = sub() { 2 };
        • 编译*ITEM = sub() { 10 };
        • 编译print 'size=', SIZE, "\n";
        • 编译print 'item=', ITEM, "\n";
      • 执行文件。
        • 执行*ITEM = sub() { 10 };
        • 执行print 'size=', SIZE, "\n";
        • 执行print 'item=', ITEM, "\n";

      注意print 'item=', ITEM, "\n"; 在 sub 存在之前是如何编译的。如果ITEM 作为一个子存在,那将是允许的。但是ITEM 不作为子存在。在没有任何其他含义的情况下,标识符是裸词,而裸词被编译成具有相同值的字符串。

      >perl -E"my $x = ITEM; say $x;"
      ITEM
      
      >perl -E"my $x = 'ITEM'; say $x;"
      ITEM
      

      也就是说,除非你明确要求 Perl 不这样做:

      >perl -E"use strict; my $x = ITEM; say $x;"
      Bareword "ITEM" not allowed while "strict subs" in use at -e line 1.
      Execution of -e aborted due to compilation errors.
      

      这意味着你需要让ITEM 看起来像一个子调用。

      print 'item=', ITEM(), "\n";
      

      &ITEM 也有效,因为& 是告诉 Perl 忽略原型的指令。

      【讨论】:

        【解决方案3】:

        & 前缀明确表示“这是下一个用户定义的子例程调用”。当您在函数名称后使用括号并且函数名称与内置函数不冲突时,或者如果您在使用函数之前已声明/定义函数并且名称与内置函数不冲突,则可以省略它内置。

        Continuing read here

        并检查@Sean McMillan 的回复。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-25
          • 1970-01-01
          • 2012-03-24
          • 1970-01-01
          • 2016-09-12
          • 1970-01-01
          相关资源
          最近更新 更多