为什么我可以在没有错误声明的情况下获取子例程地址?

欧根·康科夫(Eugen Konkov)

我有下一个程序:

use warnings;
use strict;

BEGIN {
    print \&mysub;
}


sub mysub {};

print \&mysub;

其输出:

CODE(0x118e890)CODE(0x118e890)

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

为什么我在这里没有出错?这是某种自我生存吗?

池上

是的,这是一种自我生存的形式。当需要引用该子项并且该子项不存在时,将创建一个存根。

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))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么SUN_LEN宏在没有错误的情况下取消引用NULL?

为什么批处理脚本在没有错误代码的情况下崩溃?

为什么Firefox无法在没有错误消息的情况下启动Css?

为什么我可以在没有编译器错误的情况下将错误的接口传递给函数?

为什么在不覆盖 Dart 中的所有字段的情况下实现类时没有错误?

如何在没有错误消息的情况下声明内联变量?

为什么我可以在没有 getter 方法的情况下访问私有实例变量?

为什么在没有“自我”且装饰器没有引发异常的情况下声明Python类的方法?

为什么我可以在没有用户许可的情况下删除文件?

为什么我可以在没有读取权限的情况下执行?

是否可以在没有错误处理程序的情况下对 CommandInvokeError 进行例外处理?

PDI:仅在没有错误的情况下输出

如何在没有错误的情况下git commit什么?

为什么在没有操作符地址的情况下使用函数指针?

为什么WCF服务无法在没有错误异常的情况下无法将确切的异常发送给客户端?

为什么我的代码在没有chroot函数的情况下可以工作,而在chroot函数中却失败了?

如果我可以在没有密码的情况下进行sudo,为什么需要tty来运行sudo?

为什么此命令可以在没有密码的情况下解锁我的锁定屏幕?(安全问题)

为什么我可以在没有凭据的情况下以编程方式连接到Visual Studio Online项目?

为什么此代码在没有volatile声明的情况下会失败?

有什么方法可以在不声明的情况下从扫描仪获取输入?

为什么我会在已经定义的情况下收到此 Python 错误“对象没有属性”?

GIT SVN:在没有错误的合并父级的情况下获取重新创建的SVN分支

为什么这段代码在没有我告诉它的情况下修改了我的数组?

在没有父密钥的情况下获取子“信息”的最佳方法是什么?

JVM如何在不带参数的情况下调用main()方法。没有错误,为什么?

Laravel 6-Bootstrap 为什么 Popover 在没有错误的情况下不起作用?

为什么此代码在没有volatile的情况下可以正常工作?

为什么在c ++中可以在没有#include线程的情况下使用std :: thread?