【发布时间】:2020-04-09 04:45:27
【问题描述】:
我想知道如何在编译时强制解析 subs。
对于某些背景,使用 perl,我可以在编译时使用附加到包名称末尾的 :: 严格解析包符号。例如。
perl -wE'use warnings FATAL => "bareword"; die 7; Foo::; die 42'
Bareword "Foo::" refers to nonexistent package at -e line 1.
您会在上面的代码中注意到,我们并没有死于 7 或 42。我们在运行时阶段之前就死了。这仅适用于解析包名称。我可以使用具有上述语法的方法解析运算符 (->) 并在运行时解析函数名称,
perl -E'use warnings FATAL => "bareword"; die 7; Foo::->bar(); die 42'
Bareword "Foo::" refers to nonexistent package at -e line 1.
但这并不是我想要的,
-
如果我声明一个包
Foo缺少一个子bar,并且我想在该包中调用不存在的函数bar,我将不再获得编译-时间错误,perl -E'package Foo {}; use warnings FATAL => "bareword"; die 7; Foo::->bar(); die 42' 7 at -e line 1.您可以在此处看到,当
()附加到符号末尾时,它会在运行时解析;但是,当::附加到符号的末尾时,尽管它被假定为包名称,但它会在编译时解析。 -
->运算符正在使用运行时方法解析。它搜索@ISA,并提供类的第一个参数。
如果Foo 在编译时没有bar 子,我想死。
【问题讨论】:
-
这和this question有什么不同?
-
您将此问题标记为不是骗子,因此您一定认为它有所不同。但是在您解释它的不同之处之前,我不知道我们可以如何帮助您。
标签: function perl compilation symbols compile-time