Perl 调用subref时的输入错误导致“不是全局引用”`

Perl 调用subref时的输入错误导致“不是全局引用”`,perl,syntax,glob,Perl,Syntax,Glob,一位同事在调用subref时的输入错误引发了这个奇怪的语法问题。如果我调用一个没有取消引用箭头的subref,perl将使用而不是GLOB引用。但是,如果subref作为一个对象上的方法被调用,那么它可以正常运行 这和地球仪有什么关系?为什么方法调用可以工作 use 5.12.0; use Try::Tiny; my $f = sub { 'sub ref' }; my $obj = bless({}, 'Blessed'); try { say $f($obj); # should

一位同事在调用subref时的输入错误引发了这个奇怪的语法问题。如果我调用一个没有取消引用箭头的subref,perl将使用
而不是GLOB引用
。但是,如果subref作为一个对象上的方法被调用,那么它可以正常运行

这和地球仪有什么关系?为什么方法调用可以工作

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

say
,像
print
一样,接受一个可选的文件句柄/typeglob来将输出指向,例如:

my $f = \*STDERR;
say $f ("This goes to stderr.");
直到现在,我才意识到您可以对子例程引用执行方法调用,但可以肯定的是,
perlobj
手册页声明:

如果箭头的右侧是一个标量,其中包含对 子例程,则这相当于调用引用的子例程 直接使用箭头左侧的类名或对象作为其 第一个论点。不进行查找,也不要求 子例程可以在与上的类名或对象相关的任何包中定义 箭头的左边。
say
,像
print
一样,接受一个可选的文件句柄/typeglob来将输出指向,例如:

my $f = \*STDERR;
say $f ("This goes to stderr.");
直到现在,我才意识到您可以对子例程引用执行方法调用,但可以肯定的是,
perlobj
手册页声明:

如果箭头的右侧是一个标量,其中包含对 子例程,则这相当于调用引用的子例程 直接使用箭头左侧的类名或对象作为其 第一个论点。不进行查找,也不要求 子例程可以在与上的类名或对象相关的任何包中定义 箭头的左边。