是否有针对函数的 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.
但这不是我想要的,
如果我声明一个缺少子bar
的包Foo
并且我想调用不存在的函数bar
在该包中,我将不再出现编译时错误,
perl -E'package Foo {}; use warnings FATAL => "bareword"; die 7; Foo::->bar(); die 42'
7 at -e line 1.
你可以在这里看到,当()
被附加到符号的末尾时,它在运行-时间内解析;但是,当 ::
附加到符号的末尾时,尽管它被假定为包名称,但它会在编译时解析。
->
运算符正在使用 运行 时间方法解析。它搜索 @ISA
,并且还提供 class.
的第一个参数
如果 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 非常努力地尝试弄清楚语法的含义,因此当它不起作用时并不总是以有用的错误消息结束。
我想知道如何在编译时强制解析 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.
但这不是我想要的,
如果我声明一个缺少子
bar
的包Foo
并且我想调用不存在的函数bar
在该包中,我将不再出现编译时错误,perl -E'package Foo {}; use warnings FATAL => "bareword"; die 7; Foo::->bar(); die 42' 7 at -e line 1.
你可以在这里看到,当
()
被附加到符号的末尾时,它在运行-时间内解析;但是,当::
附加到符号的末尾时,尽管它被假定为包名称,但它会在编译时解析。
的第一个参数->
运算符正在使用 运行 时间方法解析。它搜索@ISA
,并且还提供 class.
如果 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 非常努力地尝试弄清楚语法的含义,因此当它不起作用时并不总是以有用的错误消息结束。