Что означают эти ошибки Perl / Tk из Tk :: After? - PullRequest
3 голосов
/ 25 ноября 2008

Вот ошибки:

$ perl ftper.pl
Use of uninitialized value $id in hash element at /usr/lib/perl5/vendor_perl/5.1
/i686-cygwin/Tk/After.pm line 39.
se of uninitialized value $id in hash element at /usr/lib/perl5/vendor_perl/5.1
/i686-cygwin/Tk/After.pm line 39.
se of uninitialized value $id in hash element at /usr/lib/perl5/vendor_perl/5.1
/i686-cygwin/Tk/After.pm line 39.
se of uninitialized value $id in hash element at /usr/lib/perl5/vendor_perl/5.1
/i686-cygwin/Tk/After.pm line 39.
se of uninitialized value $id in hash element at /usr/lib/perl5/vendor_perl/5.1
/i686-cygwin/Tk/After.pm line 39.
se of uninitialized value $id in hash element at /usr/lib/perl5/vendor_perl/5.1
/i686-cygwin/Tk/After.pm line 39.
se of uninitialized value $id in delete at /usr/lib/perl5/vendor_perl/5.10/i686
cygwin/Tk/After.pm line 87.
se of uninitialized value $id in delete at /usr/lib/perl5/vendor_perl/5.10/i686
cygwin/Tk/After.pm line 87.
se of uninitialized value $id in delete at /usr/lib/perl5/vendor_perl/5.10/i686
cygwin/Tk/After.pm line 87.
se of uninitialized value $id in delete at /usr/lib/perl5/vendor_perl/5.10/i686
cygwin/Tk/After.pm line 87.
se of uninitialized value $id in delete at /usr/lib/perl5/vendor_perl/5.10/i686
cygwin/Tk/After.pm line 87.
se of uninitialized value $id in delete at /usr/lib/perl5/vendor_perl/5.10/i686
cygwin/Tk/After.pm line 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;
}

Ответы [ 6 ]

6 голосов
/ 26 ноября 2008

Когда я сталкиваюсь с такими проблемами, я хочу выяснить, кто их вызывает. Я превращаю все предупреждения в трассировку стека, чтобы узнать, кто запустил rukus:

use Carp;
$SIG{__WARN__} = sub { &Carp::cluck }
4 голосов
/ 26 ноября 2008

Сами сообщения об ошибках достаточно просты:

Использование неинициализированного значения $ id в хеш-элементе в строке ... Tk / After.pm 39.

Использование неинициализированного значения $ id при удалении в ... Tk / After.pm, строка 87.

  • «Использование неинициализированного значения» означает, что вы использовали значение со значением undef (не определено).
  • $id - имя неинициализированной переменной.
  • «в элементе хеша» означает, что вы использовали значение в качестве ключа хеша, например, $h{$id}
  • «в удалении» означает, что вы использовали значение в качестве хеш-ключа, который нужно удалить. например delete $h{$id}
  • "... Tx / After.pm" - модуль, в котором произошла ошибка.
  • «строка 39» и «строка 87» - это номера строк (в модуле), в которых произошла ошибка.

Tk :: After обеспечивает планирование обратного вызова для приложений Perl / Tk. Такие вещи, как «запустить эту функцию через (или каждые) 500 мс». $id - идентификатор конкретного обратного вызова в виджете.

Что делать с предупреждениями сложнее. Я не вижу явных вызовов Tk :: After в предоставленном вами коде. Возможно, в вашей установке Tk есть ошибка, которая вызывает предупреждение. Я не получаю никаких предупреждений при запуске его под Perl 5.10 с Tk 804.028.

2 голосов
/ 26 ноября 2008

Кто-то еще , похоже, столкнулся с этой проблемой при использовании Strawberry Perl 5.10. У меня такое впечатление, что это проблема библиотеки, а не вашего кода (ранее в той же функции эта запись хеша удалялась, но только если определено $id, поэтому определение $id, очевидно, не гарантируется) .

2 голосов
/ 26 ноября 2008

Я еще не пробовал ваш сценарий, но похоже, что вы могли бы решить эту проблему, удалив -w из строки shebang, который включает глобальные предупреждения, и добавив use warnings;, который включает только предупреждения в его сфера применения. См. Должен ли я включать предупреждения Perl с помощью командной строки или прагмы? для получения подробной информации.

Обновление: я пробовал это, и я не могу воспроизвести это также.

1 голос
/ 13 марта 2009

Я получаю ту же ошибку. Я считаю, что это потому, что не работает сервер дисплея. Более простой тест - просто набрать «widget» в приглашении Cygwin. Это должно вызвать демонстрацию виджета Tk. Я сообщу, если найду что-нибудь еще.

1 голос
/ 26 ноября 2008

Я вижу ту же проблему с v5.10.0 и 804.028-1 на x86 Cygwin. Интересно, что проблема не появляется, если код выполняется в отладчике, предполагая разницу в способе компиляции / выполнения / ??? внутри и снаружи отладчика.

Я подозреваю, что лежащий в основе код PerlTk правильный, и что проблема заключается в самом исходном / исполняемом файле Perl - кому следует сообщать об этом?

MikeP

...