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

时间:2011-10-21 21:58:07

标签: syntax perl

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

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

我写了

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

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

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

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

添加了编辑:

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

$x->($arg1, $arg2, ...)

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

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

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

$panel->SetDropTarget->

而不是

 $panel->SetDropTarget()->

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:6)

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

#!/usr/bin/perl

my $panel = 'main';

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

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

答案 2 :(得分:1)

解析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');