Опечатка при вызове subref умирает с помощью 'Not GLOB reference' - PullRequest
1 голос
/ 23 марта 2012

Опечатка сотрудника при вызове subref подняла этот странный вопрос синтаксиса.Если я вызываю subref без стрелки разыменования, perl умирает с Not a GLOB reference.Однако, если 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

1 Ответ

4 голосов
/ 23 марта 2012

say, как и print, принимает необязательный дескриптор файла / typeglob для прямого вывода, например:

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

До сих пор я не осознавал, что вы можете выполнить вызов метода для ссылки на подпрограмму, но, конечно же, справочная страница perlobj сообщает:

Если правая сторона стрелки является скаляром, содержащим ссылку на подпрограмма, то это эквивалентно вызову указанной подпрограммы непосредственно с именем класса или объекта на левой стороне стрелки в качестве его Первый аргумент. Нет поиска и не требуется, чтобы подпрограмма должна быть определена в любом пакете, связанном с именем класса или объектом на левая сторона стрелки.
...