2008-11-25 1 views
3

Вот ошибки:Что делать с ошибками Perl/Tk от Tk :: After mean?

 
$ 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; 
} 
+0

Можете ли вы написать более короткий пример сценария, который иллюстрирует проблему? Это поможет вам понять, кто вызывает проблему. – 2008-11-25 22:12:32

+1

Какую версию Perl и Tk вы используете? – 2008-11-25 22:15:45

+0

У меня такая же проблема, как бы коротка. Я думаю, что это проблема с библиотекой, как сказал Леон. – Paul 2008-11-26 00:46:15

ответ

4

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

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

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

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

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

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

2

Я еще не пробовал свой скрипт, но, похоже, вы могли решить эту проблему, удалив -w со строки shebang, которая включает глобальные предупреждения и добавляет use warnings;, что только включает предупреждения в свой объем. См. Should I turn on Perl warnings with the command-line switch or pragma?.

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

2

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

6

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

 
use Carp; 
$SIG{__WARN__} = sub { &Carp::cluck } 
1

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

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

MikeP

1

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