我是否总是必须提供Tkx的-command参数作为匿名子程序?

时间:2010-04-12 07:22:42

标签: perl subroutine tkx

我发现在为Tkx小部件指定-command参数时,我必须匿名包装已定义的子例程,这有点奇怪。

TkDocs tutorial的摘录证明了这一点:

my $cb = $frm->new_ttk__button ( -text => "Calculate",
                                 -command => sub {calculate();}  );

sub calculate {
   $meters = int(0.3048*$feet*10000.0+.5)/10000.0 || '';
}

当我写-command => &calculate()-command => \&calculate()时,为什么它不起作用?

3 个答案:

答案 0 :(得分:6)

你没有正确的语法。您的示例调用子例程(&绕过任何原型)并将返回值(&calculate())或对它的引用(\&calculate())传递给-command选项。您想要分配对子程序本身的引用,您可以通过以下方式执行:

-command => \&calculate

请注意缺少尾随括号。另请注意,您无法以这种方式传递参数。如果你想这样做,你需要在匿名子程序中包装调用:

-command => sub { calculate(12) }

或传递选项ARRAY引用而不是CODE引用:

-command => [\&calculate, 12]

如果您使用变量而不是文字值,那么两种形式之间存在细微差别。

-command => sub { calculate($x) }  # creates a closure over $x
-command => [\&calculate, $x]      # makes a copy of $x

在调用命令时,将显示对$x的第一个表单更改。在第二种形式下,他们不会;每次调用都会在创建绑定时看到值。两种形式都很有用;在决定使用哪个时,你只需要做出正确的判断。

答案 1 :(得分:2)

它应该与-command => \&calculate一起使用。请注意缺少括号。

您提供的示例实际上是在执行子例程并将其返回的值分配给-command键。

有关详细信息,请参阅perlsubperlref

答案 2 :(得分:2)

  扎伊德说:“我开悟了。但是我   还是不明白为什么要“计算”   语法不适用于我... - Zaid   24分钟前“

Zaid,\& calculate语法确实有效。您试图使用\& calculate()语法。第一个绑定到“对子程序的引用计算稍后运行”,后者绑定为“对(没有参数的调用计算的返回值,并绕过参数原型)的引用。”

您是否有可用于测试/分析的更长,可编辑的代码段?我最近不熟悉传统知识。