使用`Not GLOB reference`调用subref die时错字

时间:2012-03-22 22:07:59

标签: perl syntax glob

调用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

1 个答案:

答案 0 :(得分:4)

sayprint一样,接受可选的文件句柄/ typeglob来将输出定向到,例如:

my $f = \*STDERR;
say $f ("This goes to stderr.");

直到现在我才意识到你可以对子程序引用进行方法调用,但果然,perlobj手册页指出:

       如果箭头的右侧是包含对a的引用的标量        子程序,那么这相当于调用引用的子程序        直接使用箭头左侧的类名或对象作为其        第一个论点。没有查找,也没有要求        子例程在任何与类名或对象相关的包中定义        箭头的左侧。