编码
BEGIN {
*SIZE = sub() { 2 };
}
*ITEM = sub() { 10 };
print 'size=', SIZE, "\n";
print 'item=', ITEM, "\n";
如果没有错误,将按如下方式处理:
- 编译文件。
- 编译
BEGIN
块。
- 执行
BEGIN
块。
- 编译
*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 忽略原型的指令。