gpt4 book ai didi

perl - 为什么我可以在声明之前获取子程序地址而不会出错?

转载 作者:行者123 更新时间:2023-12-02 01:55:37 27 4
gpt4 key购买 nike

我有下一个程序:

use warnings;
use strict;

BEGIN {
print \&mysub;
}


sub mysub {};

print \&mysub;

其输出:

CODE(0x118e890)CODE(0x118e890)

BEGIN block 在编译时处理。此时编译器还没有看到 sub mysub 的定义。但程序仍然打印正确的子例程地址,该地址在定义时将具有。

为什么我在这里没有收到错误?这是某种自动复活吗?

最佳答案

是的,这是一种自动生存形式。当需要对子对象的引用并且子对象不存在时,就会创建 stub 。

use strict;
use warnings qw( all );
use feature qw( say );

sub test {
say defined(&mysub) ? "defined (".\&mysub.")"
: exists(&mysub) ? "exists (".\&mysub.")"
: "doesn't exist";
}

test();
my $ref = \&mysub;
test();
eval("sub mysub { } 1") or die($@);
test();

输出:

doesn't exist
exists (CODE(0xab8cd8))
defined (CODE(0xab8cd8))

关于perl - 为什么我可以在声明之前获取子程序地址而不会出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44905890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com