[英]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=', 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忽略原型的指令。
&前缀明确表示“这是下一个用户定义的子例程调用”。 您可以在函数名称之后使用parens并且函数名称与内置函数不冲突时,或者在使用函数之前声明/定义函数且名称与函数不冲突时,可以省略该函数。内置的。
并检查@Sean McMillan的回复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.