调用subref时,一位同事的拼写错误引发了这个奇怪的语法问题。如果我在没有解除引用箭头的情况下调用subref,则perl将与Not a GLOB reference
一起死亡。但是,如果将subref作为祝福对象上的方法调用,则运行正常。
这与globs有什么关系?为什么方法调用工作?
use 5.12.0;
use Try::Tiny;
my $f = sub { 'sub ref' };
my $obj = bless({}, 'Blessed');
try {
say $f($obj); # should be $f->();
} catch {
say "ERROR: $_";
};
say $obj->$f();
输出:
C:\code>perl dispatch.pl
ERROR: Not a GLOB reference at dispatch.pl line 8.
sub ref
答案 0 :(得分:4)
say
与print
一样,接受可选的文件句柄/ typeglob来将输出定向到,例如:
my $f = \*STDERR;
say $f ("This goes to stderr.");
直到现在我才意识到你可以对子程序引用进行方法调用,但果然,perlobj
手册页指出:
如果箭头的右侧是包含对a的引用的标量 子程序,那么这相当于调用引用的子程序 直接使用箭头左侧的类名或对象作为其 第一个论点。没有查找,也没有要求 子例程在任何与类名或对象相关的包中定义 箭头的左侧。