What do these Perl/Tk errors from Tk::After mean?

Here are the errors:

$ 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.  

Here is the Perl/Tk code:

#! /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;
}

Answers


The error messages themselves are straightforward enough:

Use of uninitialized value $id in hash element at ...Tk/After.pm line 39.

Use of uninitialized value $id in delete at ...Tk/After.pm line 87.

  • "Use of uninitialized value" means that you used a value with a value of undef (undefined).
  • $id is the name of the uninitialized variable.
  • "in hash element" means that you used the value as hash key, e.g. $h{$id}
  • "in delete" means that you used the value as a hash key to be deleted. e.g. delete $h{$id}
  • "...Tx/After.pm" is the module where the error occurred.
  • "line 39" and "line 87" are the line numbers (in the module) where the error occurred.

Tk::After provides callback scheduling to Perl/Tk applications. Things like "run this function after (or every) 500 ms." $id is the identifier for a specific callback on a widget.

What do do about the warnings is harder. I don't see any explicit calls to Tk::After in the code you provided. It's possible that there's a bug in your Tk installation that's triggering the warning. I don't get any warnings when running it under Perl 5.10 with Tk 804.028.


When I run into these sorts of problems, I want to find out who causes them. I turn all warnings into a stack backtrace to see who started the rukus:

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

Need Your Help

MySQL bit inversion, how to only negate the fist x bits?

mysql bit-manipulation

I am using bitwise operators in MySQL. I have a column of 6 bits. When I used the bit negation operator "~" I get a 64 bt integer returned. This means I have a number of leading 1's that I don't wa...

How to bind a target within MSBuild to a general error

visual-studio-2008 tfs msbuild continuous-integration msbuild-task

We are using TFS build and we have a couple of custom steps within the configuration (e.g. running NUnit tests in AfterCompile target, deployment steps in AfterDropBuild target etc.). Now I wanted ...

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.