是否有针对函数的 Perl 严格符号解析语法?

Is there a Perl strict symbol resolution syntax for functions?

我想知道如何在编译时强制解析 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。我们在 运行 时间阶段之前就死了。这仅适用于解析包名称。我可以使用具有上述语法的方法解析运算符 (->) 并在 运行-time,

中解析函数名称
perl -E'use warnings FATAL => "bareword"; die 7; Foo::->bar(); die 42'
Bareword "Foo::" refers to nonexistent package at -e line 1.

但这不是我想要的,

如果 Foo 在编译时没有 bar sub,我想死。

调用不带括号的函数将尝试解析解析阶段的符号,这也包括完全限定的符号。棘手的部分是当它没有解决时会发生什么。在 use strict 'subs' 下,由于不允许裸字字符串,它会死掉。

use strict;
use warnings;
Foo::bar; # Bareword "Foo::bar" not allowed while "strict subs" in use

当有争论时,这会变得更加棘手。它仍会尝试将其解析为裸字字符串,因此当它后面跟有一些没有意义的内容时可能会报告语法错误。

use strict;
use warnings;
Foo::bar 42; # Number found where operator expected

其他时候它会将其解析为间接方法调用,然后将错误推迟到运行时,或者甚至可能最终会做一些您没有预料到的事情。

use strict;
use warnings;
my $foo;
Foo::bar $foo; # Can't call method "bar" on an undefined value

基本上,Perl 非常努力地尝试弄清楚语法的含义,因此当它不起作用时并不总是以有用的错误消息结束。