繁体   English   中英

Perl-BEGIN非BEGIN块中的差异

[英]Perl - Differences in BEGIN an non-BEGIN block

我对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块是在编译时运行的。

由于BEGIN块是在编译时运行的,因此编译器知道*SIZE的分配,而*ITEM的分配尚未发生。

由于编译器不了解*ITEM ,因此对ITEM调用是模棱两可的,因此必须在其前面加上& 否则,编译器会认为这可能是“裸词”(unquoted string)。

如果use strict ,则编译将假定裸词为函数。

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

代码

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 print 'item=', ITEM, "\\n";
  • 执行文件。
    • 执行*ITEM = sub() { 10 };
    • 执行print'size print 'size=', SIZE, "\\n";
    • 执行print'item print 'item=', ITEM, "\\n";

注意如何print 'item=', ITEM, "\\n"; 在子存在之前被编译。 如果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忽略原型的指令。

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

继续阅读这里

并检查@Sean McMillan的回复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM