Почему этот фрагмент жалуется на «Не удается найти метод объекта« this »через пакет« t »», а не просто не запустить? » - PullRequest
3 голосов
/ 06 марта 2020

Найдена ошибка опечатки в старом скрипте, но я не понимаю, как эта строка проходит perl -cw:

$ perl -w -e 'my $t = "t"; this{$t} '
Can't locate object method "this" via package "t" (perhaps you forgot to load "t"?) at -e line 1.
$ perl -w -e 'my $t; this{$t} '
Can't call method "this" on an undefined value at -e line 1.

Ошибка - отсутствующий символ $ для ха sh %this Но почему perl думает, что я пытаюсь ссылаться на объект здесь?

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Это синтаксис косвенного объекта METHOD OBJECT. this{$t} похоже на this {$t} или this $t или $t->this.

Для простого инварианта скалярной переменной {} является необязательным, но если ваш инвокант был каким-то другим выражением, например $h{$t} , this $h{$t} не работает; это должно быть $h{$t}->this или this { $h{$t} }.

2 голосов
/ 06 марта 2020
$ perl -MO=Deparse -e 'this{$t}'
this {
    $t
} ;

$ perl -we 'sub this{42} ; this{$t}'
Name "main::t" used only once: possible typo at -e line 1.
Odd number of elements in anonymous hash at -e line 1.
Use of uninitialized value $t in anonymous hash ({}) at -e line 1.

$ perl -we 'sub this{42} ; this{42,43}'
# No output

Perl анализирует {$t} как анонимную ссылку ha sh и ожидает, что this будет подпрограммой, которая может принять ссылку в качестве аргумента. После того, как Perl не удается найти подпрограмму с именем this, он пытается выяснить, можно ли разобрать конструкцию как косвенный синтаксис объекта. А именно, он идентифицирует тип объекта {$t} и ищет метод this в пространстве имен этого типа объекта. Это последний метод разрешения, который пытается использовать синтаксический анализатор, поэтому при сбое вы получаете сообщение об ошибке из этого раздела синтаксического анализатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...