perl
2012-04-27 71 views 3 likes 
3

我有一个关于perl中的const声明的问题, 并且找不出差异,请亲切点 指出有什么区别。Perl - 差异BEGIN非BEGIN块

下面是代码:

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

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

现在是个问题, 为什么

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

行必须有一个 '&' 项, 的前面,但

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

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

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

回答

7

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

由于编译器不知道关于*ITEM,所以对ITEM的调用不明确,因此您必须在它前面加上&。否则,编译器认为它可能是一个“裸语” - 一个没有引号的字符串。

如果你use strict,编译会假设裸词是函数。

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

+0

我看到了差异,谢谢大家的快速回答。 – 2012-04-27 11:33:53

1

&前缀毫不含糊地表示“这是用户定义的下一个子程序调用”。在函数名称后面使用parens并且函数名称与内置函数不冲突时,或者在使用函数名称之前声明/定义函数,并且名称不与内置。

Continuing read here

并检查@Sean麦克米兰响应。

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";编译。如果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忽略原型。

 相关问题

  • 暂无相关问题^_^