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