为什么这个Perl代码不是错误的

4 syntax perl

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

$panel->SetDropTarget( MyTextDropTarget->new($panel) );
Run Code Online (Sandbox Code Playgroud)

我写

$panel->SetDropTarget->( MyTextDropTarget->new($panel) );
Run Code Online (Sandbox Code Playgroud)

并且Perl没有抱怨.(Perl使用一些参数调用了一些函数,并且脚本错误输出并显示错误消息:

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

我很好奇Perl如何解析'错误'版本.

新增编辑:

好的,所以如果$ x = \&some_function,那么我理解为什么

$x->($arg1, $arg2, ...)
Run Code Online (Sandbox Code Playgroud)

调用some_function($ arg1,$ arg2,.....).

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

从错误消息中我们可以假设正在调用SetDropTarget().如果runrig的例子在这里仍然适用(我猜它确实如此),那么即使SetDropTarget后面没有括号,即我有

$panel->SetDropTarget->
Run Code Online (Sandbox Code Playgroud)

代替

 $panel->SetDropTarget()->
Run Code Online (Sandbox Code Playgroud)

Perl还在调用SetDropTarget吗?(检查其参数的数量和类型,然后在运行时致命抱怨).这是怎么回事?

Ric*_*ões 6

因为它是完全有效的语法.$panel->SetDropTarget->( MyTextDropTarget->new($panel) )表示" &SetDropTarget从中调用方法$panel,然后取消引用&SetDropTarget返回的子参数".我猜这不是你想写的,但是任何错误都会在运行时出现,即使在严格模式下也是如此.

  • 添加到RichardSimões所说的内容:当一个方法不带参数时,括号是可选的; 也就是说,`$ foo-> bar()`可以写成`$ foo-> bar`.这就是为什么`$ panel-> SetDropTarget - >(...)`的意思是`$ panel-> SetDropTarget() - >(...)`. (4认同)

run*_*rig 6

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

#!/usr/bin/perl

my $panel = 'main';

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

sub SetDropTarget {
  return sub { print "Set the $_[0] drop target!\n" }
}
Run Code Online (Sandbox Code Playgroud)