Syntax 为什么不是';这段Perl代码不是一个错误吗

Syntax 为什么不是';这段Perl代码不是一个错误吗,syntax,perl,Syntax,Perl,我正在写一个WxPerl程序,而不是 $panel->SetDropTarget( MyTextDropTarget->new($panel) ); $panel->SetDropTarget()-> 我写 $panel->SetDropTarget->( MyTextDropTarget->new($panel) ); Perl也没有抱怨。(Perl使用一些参数调用了某个函数,但脚本确实出现了错误,并显示了一条错误消息: 用法:Wx::Wind

我正在写一个WxPerl程序,而不是

$panel->SetDropTarget( MyTextDropTarget->new($panel) );
 $panel->SetDropTarget()->
我写

$panel->SetDropTarget->( MyTextDropTarget->new($panel) );
Perl也没有抱怨。(Perl使用一些参数调用了某个函数,但脚本确实出现了错误,并显示了一条错误消息:

用法:Wx::Window::SetDropTarget(THIS,target)位于./x.pl第230行

我很好奇Perl是如何解析“错误”版本的。 新增编辑:

好的,如果$x=\&某个函数,那么我理解为什么

$x->($arg1, $arg2, ...)
调用一些函数($arg1,$arg2,…)

runrig的例子是一种可能性,但我非常确定: 1) $panel包含受祝福的对象引用,而不是字符串。 2) SetDropTarget是$panel的方法(在基类中)

从错误消息中,我们可以假设调用了SetDropTarget()。如果runrig的示例仍然适用于这里(我猜是的),那么即使SetDropTarget后面没有括号,也就是说,我有

$panel->SetDropTarget->
而不是

$panel->SetDropTarget( MyTextDropTarget->new($panel) );
 $panel->SetDropTarget()->
Perl仍在调用SetDropTarget?(它检查参数的数量和类型,然后在运行时发出致命的抱怨)。这就是发生的情况吗?

Perl解析

$panel->SetDropTarget->( MyTextDropTarget->new($panel) );
意思是“
$panel
是一个对象;调用其
SetDropTarget
方法(省略可选括号),该方法将返回对
sub
的引用;调用该
sub
,将
MyTextDropTarget->new($panel)
的结果作为其单个参数传递。”

也就是说,Perl期望在以下代码中的
SetDropTarget
类似于
foo

sub foo {
    return sub {
        my $bar = shift;
        return $bar . ', world!'; 
    }
}

foo()->('Hello');
foo->('Goodby');

因为它的语法非常有效
$panel->SetDropTarget->(MyTextDropTarget->new($panel))
的意思是“从
$panel
调用
&SetDropTarget
方法,然后取消引用
&SetDropTarget
返回的子引用。”,即使在严格模式下。

您的SetDropTarget可能也不会返回代码引用,但在运行时之前您无法判断:

#!/usr/bin/perl

my $panel = 'main';

$panel->SetDropTarget->("bloomin'");

sub SetDropTarget {
  return sub { print "Set the $_[0] drop target!\n" }
}

我相当肯定这是错误的-有两个函数调用正在发生,而不是像您所指出的那样只有一个。(参见@runrig的例子)我不会说“一个成员”,而是“一个方法”。而不是“它本身是一个对sub的引用”,而是“它返回一个对sub的引用”;也就是说,
$foo->bar()
可以写成
$foo->bar
。这就是为什么
$panel->SetDropTarget->(…)
被理解为
$panel->SetDropTarget()->(…)
的意思。