Perl 为什么这段代码抱怨';Can';t定位对象方法“;这";via package";"';而不仅仅是跑不动?

Perl 为什么这段代码抱怨';Can';t定位对象方法“;这";via package";"';而不仅仅是跑不动?,perl,Perl,在一个旧脚本中发现了一个打字错误,但我不明白这行代码是如何传递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

在一个旧脚本中发现了一个打字错误,但我不明白这行代码是如何传递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.
这个bug是hash
%缺少的
$
符号,这个
但是为什么perl认为我在这里尝试引用一个对象呢

$ 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}
解析为一个匿名哈希引用,并期望
这个
是一个可以接受该引用作为参数的子例程。在Perl找不到名为this
的子例程之后,它会尝试查看是否可以将构造解析为间接对象语法。也就是说,它标识
{$t}
的对象类型,并在该对象类型的命名空间中查找方法
this
。这是解析器尝试的最后一个解析方法,因此当它失败时,您将从解析器的该部分获得错误消息。

这是
方法对象
间接对象语法
this{$t}
类似于
this{$t}
this$t
$t->this


对于简单的标量变量invocant,
{}
是可选的,但是如果您的invocant是其他表达式,例如
$h{$t}
这个$h{$t}
不起作用;它必须是
$h{$t}->this
this{$h{$t}

这看起来像
间接对象语法
新建文件$path,
文件->新建($path,$data)
可能与
取消引用方法调用相结合
?这由:间接方法调用.Re“Perl正在解析
{$t}
作为匿名哈希引用”,不,不是。哈希构造函数不能跟在空字后面。解析器从一开始就将其视为间接方法调用的块。Perl使用LR解析器,而不是LL解析器,因此回溯不是一件事。Re“这是解析器尝试的最后一种解析方法,因此当它失败时,您会从解析器的该部分获得错误消息”。否。这是完全错误的。首先,我们讨论的是运行时错误。解析器没有涉及它。在尝试一个方法调用之前,它肯定不会尝试任何东西。@ikegami您是正确的,解析器没有尝试多个东西,但是如果bareword是编译时现有的子例程,它将使用hashref参数将其作为子调用进行解析;如果不是,它将被解析为一个间接对象调用(在运行时失败)@ysth,我使用的是有文档记录的bareword定义(一个被视为字符串文字的单词,因为它没有其他含义)。根据这个定义,子名称不是一个空话。但话说回来,这两个名称都不是方法名。所以“赤裸裸”是一个不正确的词语选择。当我说bareword时,我实际上是指“既不是运算符名称也不是子名称的标识符”,因此我更正的句子是“哈希构造函数不能跟随既不是运算符名称也不是子名称的标识符。”