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 の se
/i686-cygwin/Tk/After.pm 39 行目。
/usr/lib/perl5/vendor_perl/5.1 のハッシュ要素の初期化されていない値 $id の se
/i686-cygwin/Tk/After.pm 39 行目。
/usr/lib/perl5/vendor_perl/5.1 のハッシュ要素の初期化されていない値 $id の se
/i686-cygwin/Tk/After.pm 39 行目。
/usr/lib/perl5/vendor_perl/5.1 のハッシュ要素の初期化されていない値 $id の se
/i686-cygwin/Tk/After.pm 39 行目。
/usr/lib/perl5/vendor_perl/5.1 のハッシュ要素の初期化されていない値 $id の se
/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

このような問題に遭遇したとき、誰が原因なのかを突き止めたいと思います。すべての警告をスタック バックトレースに変換して、誰が ruku を開始したかを確認します。

鯉を使う;
$SIG{__WARN__} = サブ { &Carp::cluck }
于 2008-11-25T22:15:09.203 に答える
4

エラーメッセージ自体は十分に単純です。

... Tk/After.pmの39行目のハッシュ要素での初期化されていない値$idの使用。

... Tk/After.pm行87の削除で初期化されていない値$idを使用します。

  • 「初期化されていない値の使用」とは、(未定義)の値を持つ値を使用したことを意味しますundef
  • $id初期化されていない変数の名前です。
  • 「ハッシュ要素内」とは、値をハッシュキーとして使用したことを意味します。$h{$id}
  • 「削除中」とは、削除するハッシュキーとして値を使用したことを意味します。例えばdelete $h{$id}
  • 「...Tx/ After.pm」は、エラーが発生したモジュールです。
  • 「39行目」と「87行目」は、エラーが発生した(モジュール内の)行番号です。

Tk :: Afterは、Perl/Tkアプリケーションにコールバックスケジューリングを提供します。「500ミリ秒後に(または毎回)この関数を実行する」など。$idウィジェットの特定のコールバックの識別子です。

警告をどうするかは難しいです。提供したコードには、Tk::Afterへの明示的な呼び出しはありません。Tkのインストールに、警告をトリガーするバグがある可能性があります。Tk804.028を使用してPerl5.10で実行しても、警告は表示されません。

于 2008-11-25T21:25:55.073 に答える
2

スクリプトはまだ試していませんが-w、グローバル警告をオンにするシバン行からを削除use warnings;し、スコープ内の警告のみをオンにするを追加することで、この問題を解決できるようです。コマンドラインスイッチまたはプラグマを使用してPerl警告をオンにする必要がありますか?を参照してください。詳細については。

更新:試しましたが、再現できません。

于 2008-11-25T21:26:32.890 に答える
2

他の誰かがStrawberryPerl5.10を使用してその問題を抱えているようです。私はそれがあなたのコードではなくライブラリの問題であるという印象を持っています(同じ関数の前半で、そのハッシュエントリは削除されますが、定義されている場合のみ$idなので、明らか$idに定義されていることは保証されません)。

于 2008-11-25T21:28:23.027 に答える
1

x86Cygwinのv5.10.0と804.028-1でも同じ問題が発生しています。興味深いことに、コードがデバッガーで実行された場合、問題は発生しません。これは、コードのコンパイル/実行/???の方法に違いがあることを示しています。デバッガーの内部と外部。

基礎となるPerlTkコードが正しく、問題はPerlソース/実行可能ファイル自体にあると思います-この種のことは誰に報告する必要がありますか?

MikeP

于 2008-11-26T08:37:20.273 に答える