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和朋友记录于 >像sub foo这样的预先声明;仅在原型的上下文中提供解析器的指导,并且裸字与子例程调用消歧.它不会使解析器跳转到实际定义.由预先声明生成的子例程存根实际上不可调用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |