3

以下是错误:

$ perl ftper.pl
在 /usr/lib/perl5/vendor_perl/5.1 的哈希元素中使用未初始化的值 $id
/i686-cygwin/Tk/After.pm 第 39 行。
在 /usr/lib/perl5/vendor_perl/5.1 的哈希元素中的未初始化值 $id
/i686-cygwin/Tk/After.pm 第 39 行。
在 /usr/lib/perl5/vendor_perl/5.1 的哈希元素中的未初始化值 $id
/i686-cygwin/Tk/After.pm 第 39 行。
在 /usr/lib/perl5/vendor_perl/5.1 的哈希元素中的未初始化值 $id
/i686-cygwin/Tk/After.pm 第 39 行。
在 /usr/lib/perl5/vendor_perl/5.1 的哈希元素中的未初始化值 $id
/i686-cygwin/Tk/After.pm 第 39 行。
在 /usr/lib/perl5/vendor_perl/5.1 的哈希元素中的未初始化值 $id
/i686-cygwin/Tk/After.pm 第 39 行。
在 /usr/lib/perl5/vendor_perl/5.10/i686 处删除的未初始化值 $id 的 se
cygwin/Tk/After.pm 第 87 行。
在 /usr/lib/perl5/vendor_perl/5.10/i686 处删除的未初始化值 $id 的 se
cygwin/Tk/After.pm 第 87 行。
在 /usr/lib/perl5/vendor_perl/5.10/i686 处删除的未初始化值 $id 的 se
cygwin/Tk/After.pm 第 87 行。
在 /usr/lib/perl5/vendor_perl/5.10/i686 处删除的未初始化值 $id 的 se
cygwin/Tk/After.pm 第 87 行。
在 /usr/lib/perl5/vendor_perl/5.10/i686 处删除的未初始化值 $id 的 se
cygwin/Tk/After.pm 第 87 行。
在 /usr/lib/perl5/vendor_perl/5.10/i686 处删除的未初始化值 $id 的 se
cygwin/Tk/After.pm 第 87 行。  

这是 Perl/Tk 代码:

#! /usr/bin/perl -w

use strict;
use Tk;
use Tk::Scale;
use File::DosGlob 'glob';


#####################################################################
# Define variables                              #
#####################################################################
my $UserID;
my $Password;
my $BnsNode;
my $Status_msg = "BUILD SCRIPT!";

#####################################################################
# Window variables                          #
#####################################################################
my $mw;
my $frmUserID;
my $lblUserID;
my $frmPassword;
my $lblPassword;
my $edtUserID;
my $edtPassword;
my $frmTop;
my $frmBig;
my $frmButtonLine;
my $btnExit;
my $btnSubmit;
my $lblStatus;
my $lblUnixNode;
my $frmUnixNode;
my $edtUnixNode;

#################################################################
# Main Logic                            #
#################################################################
init_mainwindow();
MainLoop;



#################################################################
# init_mainwindow                       #
#################################################################
sub init_mainwindow {
    $mw = MainWindow->new;
    $mw->title("BUILD");
    $mw->resizable(100, 100);
    $mw->geometry("+175+100");

    # Top Level frame for top section of form.
    $frmTop = $mw->Frame(-bd => 2, -relief => 'ridge')
        ->pack(-side => 'top', -fill => 'x', -pady => 3);


    $frmUserID = $frmTop->Frame(-bd => 2)->pack(
        -side => 'top', -fill => 'x');
    $lblUserID = $frmUserID->Label(-text => "Unix User ID:")
        ->pack(-side => 'left');
    $edtUserID = $frmUserID->Entry(-textvariable => \$UserID,
        -background => 'white')->pack(-side => 'left');


    $frmUnixNode = $frmTop->Frame(-bd => 2)->pack(
    -side => 'top', -fill => 'x');
    $lblUnixNode = $frmUserID->Label(-text => "BNS Number")
        ->pack(-side => 'left');
    $edtUnixNode = $frmUserID->Entry(-textvariable => \$BnsNode,
    -background => 'white')->pack(-side => 'left');


$frmPassword = $frmTop->Frame(-bd => 2)->pack(
    -side => 'top', -fill => 'x');
$lblPassword = $frmPassword->Label(
    -text => "Password:    ")->pack(-side => 'left');
$edtPassword = $frmPassword->Entry(-textvariable => \$Password,
    -background => 'white', -show => "*")
    ->pack(-side => 'left');



# Top Level frame for bottom section of form.
$frmButtonLine = $mw->Frame(-bd => 2, -relief => 'ridge')
    ->pack(-side => 'top', -fill => 'x', -pady => 3);
    $btnExit = $frmButtonLine->Button(-text => "Exit", 
        -command => \&close_mw, -width => 6)->pack(
        -side => 'right', -padx => 1);
        $btnSubmit = $frmButtonLine->Button(-text => "Run Script", 
    -command => \&execute_script, -width => 6)->pack(
        -side => 'right', -padx => 1);
    $lblStatus = $mw->Label(-textvariable => \$Status_msg,
        -borderwidth => 2, -relief => 'groove')
        ->pack(-fill => 'x', -side => 'bottom');

    $edtUserID->focus;

}


#####################################################################
# excute_script                             #
#####################################################################
sub execute_script {
    unless (defined($UserID)) {
        update_status("Must enter a user id!");
        $edtUserID->focus;
        return 0;
    }
    unless (defined($Password)) {
        update_status("Must enter a password!");
        $edtPassword->focus;
        return 0;
    }

    update_status("$BnsNode ,$UserID ");
}

#####################################################################
# close_mw                              #
#####################################################################
sub close_mw {
    $mw->destroy;
}


#####################################################################
# update_status                             #
#####################################################################
sub update_status {
    my ($msg) = @_;

    $Status_msg = $msg;
    $lblStatus -> update;
}
4

6 回答 6

6

当我遇到这些问题时,我想找出是谁造成的。我将所有警告都转换为堆栈回溯,以查看是谁启动了 rukus:

使用鲤鱼;
$SIG{__WARN__} = sub { &Carp::cluck }
于 2008-11-25T22:15:09.203 回答
4

错误消息本身很简单:

在 ...Tk/After.pm 第 39 行的哈希元素中使用未初始化的值 $id。

在 ...Tk/After.pm 第 87 行的删除中使用未初始化的值 $id。

  • “使用未初始化的值”是指您使用了值为undef(undefined) 的值。
  • $id是未初始化变量的名称。
  • “在散列元素中”表示您使用该值作为散列键,例如$h{$id}
  • “in delete”表示您将该值用作要删除的哈希键。例如delete $h{$id}
  • “...Tx/After.pm”是发生错误的模块。
  • “第 39 行”和“第 87 行”是发生错误的行号(在模块中)。

Tk::After 为 Perl/Tk 应用程序提供回调调度。诸如“在(或每隔)500 毫秒后运行此功能”之类的内容。$id是小部件上特定回调的标识符。

对警告做什么更难。在您提供的代码中,我没有看到对 Tk::After 的任何显式调用。您的 Tk 安装中可能存在触发警告的错误。在带有 Tk 804.028 的 Perl 5.10 下运行它时,我没有收到任何警告。

于 2008-11-25T21:25:55.073 回答
2

我还没有尝试过你的脚本,但看起来你可以通过-w从 shebang 行中删除来解决这个问题,这会打开全局警告,并添加 in use warnings;,它只会在其范围内打开警告。请参阅我应该使用命令行开关或编译指示打开 Perl 警告吗?详情。

更新:我已经尝试过了,我也无法重现它。

于 2008-11-25T21:26:32.890 回答
2

其他人似乎在使用 Strawberry Perl 5.10 时遇到了这个问题。我的印象是这是库的问题,而不是您的代码(在同一函数的早期,该哈希条目被删除,但只有在$id已定义时才被删除,因此显然$id不能保证已定义)。

于 2008-11-25T21:28:23.027 回答
1

我在 x86 Cygwin 上看到与 v5.10.0 和 804.028-1 相同的问题。有趣的是,如果代码在调试器中执行,则不会出现问题,这表明代码编译/执行的方式有所不同/??? 调试器的内部和外部。

我怀疑底层 PerlTk 代码是正确的,问题在于 Perl 源代码/可执行文件本身——这种事情应该报告给谁?

迈克P

于 2008-11-26T08:37:20.273 回答
1

我犯了同样的错误。我相信这是因为没有运行显示服务器。一个更基本的测试是在 Cygwin 提示符下简单地键入“widget”。它应该会调出 Tk 小部件演示。如果我发现任何进一步的信息,我会报告。

于 2009-03-13T00:40:37.807 回答