Linux 在Perl Tk中使用按钮小部件执行命令

Linux 在Perl Tk中使用按钮小部件执行命令,linux,perl,perltk,Linux,Perl,Perltk,在此代码中,当按下按钮$按钮时,程序关闭。因为它执行exit命令。我想修改代码,这样当用户单击按钮时,它将刷新iptables规则(iptables-F)。我该怎么做 我试过这个: #!/usr/local/bin/perl use Tk; # Main Window $mw = new MainWindow; $label = $mw -> Label(-text=>"Hello World") -> pack(); $button = $mw -> Button(-t

在此代码中,当按下按钮
$按钮
时,程序关闭。因为它执行exit命令。我想修改代码,这样当用户单击按钮时,它将刷新iptables规则(
iptables-F
)。我该怎么做

我试过这个:

#!/usr/local/bin/perl
use Tk;
# Main Window
$mw = new MainWindow;
$label = $mw -> Label(-text=>"Hello World") -> pack();
$button = $mw -> Button(-text => "Quit",
                -command => sub { exit }) -> pack();
MainLoop;

为什么这不起作用?我应该为它创建一个子程序(然后在那里编写
iptables-F
命令),然后调用该子程序吗?我不能像在上面的代码中那样直接输入命令吗?

您需要指定一个代码引用—一个回调—当按下按钮时将执行该回调,因此是的,您应该将系统调用放在
子{}

您编写的是在按钮被定义时对system()的调用,因此您将system()的返回值指定为回调的coderef,这将不起作用。定义按钮时将调用system()函数,而不是在按下按钮时调用,这不是您想要的。

@定义按钮时将调用system()函数。你的意思是如果我执行这个程序,那么当按钮被定义的时候规则就会被刷新,对吗?我有一个错误。阐述马丁的解释
$button = $mw -> Button(-text => "Flush the rules",
                    -command => system ( iptables -F )) -> pack();