加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 为什么即使使用前向声明,我也不能在BEGIN块中调用后来定

发布时间:2020-12-15 23:20:46 所属栏目:大数据 来源:网络整理
导读:这有效: use strict;X("xxxxxx");sub X { print shift;} 这会产生错误: use strict;BEGIN { X("xxxxxx");}sub X { print shift;} 错误: Undefined subroutine main::X called at ./test.pl line 5. 这是有道理的,因为我们在执行sub …时处于编译阶段的中
这有效:

use strict;
X("xxxxxx");
sub X { print shift;}

这会产生错误:

use strict;
BEGIN {
    X("xxxxxx");
}
sub X { print shift;}

错误:

Undefined subroutine &main::X called at ./test.pl line 5.

这是有道理的,因为我们在执行sub …时处于编译阶段的中间,所以编译器还没有到达子声明/定义.

…但是:添加前向声明(在BEGIN块之前或之内)没有帮助:

use strict;
sub X;
BEGIN {
    X("xxxxxx");
}
sub X { print shift;}

为什么在BEGIN块中调用函数时前向声明不起作用?我认为它发生在编译阶段,就像我的声明那样.

perldoc perlsub似乎没有任何光明.

解决方法

解析后立即执行BEGIN块.这意味着perl还没有看到sub的定义.您唯一的解决方案是在使用之前定义函数:

sub foo { print shift }
# When the parser reaches this point,the "foo" sub has been compiled

BEGIN {
    # Ergo,"foo" can be used here
    foo("xxx");
}
# The BEGIN block is executed once the parser arrives here

您也可以选择稍后执行的移相器,例如在里面:

INIT {
    foo("xxx");
}

sub foo { print shift }

BEGIN和朋友记录于perldoc perlmod

>像sub foo这样的预先声明;仅在原型的上下文中提供解析器的指导,并且裸字与子例程调用消歧.它不会使解析器跳转到实际定义.由预先声明生成的子例程存根实际上不可调用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读