Что означают эти ошибки Perl / Tk из Tk :: After?

Вот ошибки:

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

person Paul    schedule 25.11.2008    source источник
comment
Можете ли вы написать более короткий пример сценария, иллюстрирующий проблему? Это может помочь вам выяснить, кто является причиной проблемы.   -  person brian d foy    schedule 26.11.2008
comment
Какую версию perl и Tk вы используете?   -  person Michael Carman    schedule 26.11.2008
comment
У меня одна и та же проблема, какой бы короткой она ни была. Я думаю, что проблема с библиотекой, как сказал Леон.   -  person Paul    schedule 26.11.2008
comment
perl 5.10.0 perl-tk 804.028-1 Интерфейс Perl для tk (x11)   -  person Paul    schedule 26.11.2008
comment
Если бы у вас была такая же проблема, независимо от того, насколько короткой была ваша программа, у вас мог бы быть более короткий вопрос, который дает всем меньше возможностей для расследования :)   -  person brian d foy    schedule 26.11.2008
comment
Брайан: Верно, я буду иметь это в виду. Спасибо!   -  person Paul    schedule 26.11.2008


Ответы (6)


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

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

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

  • Использование неинициализированного значения означает, что вы использовали значение со значением undef (не определено).
  • $id - это имя неинициализированной переменной.
  • в элементе хэша означает, что вы использовали значение как хеш-ключ, например $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.

person Michael Carman    schedule 25.11.2008
comment
Мне больше всего понравился ваш ответ, поскольку он объясняет проблему. Хотя для краткосрочного решения собираюсь обратиться к предупреждениям. Я использую Cygwin-порт Perl 5.10 с Tk 804.028. Может быть, поэтому я это вижу, а вы нет. - person Paul; 26.11.2008

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

use Carp;
$SIG{__WARN__} = sub { &Carp::cluck }
person brian d foy    schedule 25.11.2008
comment
Есть ли причина, по которой нет: $ SIG {WARN} = \ & Carp :: cluck; ? - person Leon Timmermans; 26.11.2008
comment
Мне нравится этот ответ, но ответ кармана действительно ответил на вопрос. Хотя ваш ответ дает мне возможность узнать это самостоятельно. - person Paul; 26.11.2008
comment
Нет причин, по которым это не \ & Carp :: cluck; Думаю, я просто часто набираю sub {}. - person brian d foy; 26.11.2008

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

person Leon Timmermans    schedule 25.11.2008

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

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

person Community    schedule 25.11.2008
comment
Это было сложно, потому что ваш ответ действительно решил мою проблему, что с этим делать. Но другие действительно ответили, почему и из-за того, как проблема была сформулирована, мне придется пойти с ответом Карман. - person Paul; 26.11.2008

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

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

MikeP

person Community    schedule 26.11.2008

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

person Community    schedule 13.03.2009