sub print
{
print $value unless $value eq '-';
}
...
Incidentally, why does this print sub [not] simply call itself recursively??
Its a namespace problem (feature? artifact?). Your new print is defined in main and the built-in print is defined in CORE and the CORE namespace has search precedence. Try the following:
>perl -wMstrict -le
"sub print { CORE::print('foo') }
::print;
"
foo
>perl -wMstrict -le
"sub print { ::print('foo') }
::print;
"
Deep recursion on subroutine "main::print" at -e line 1.
Terminating on signal SIGINT(2)
| [reply] [d/l] [select] |
Thanks, AnomalousMonk, for the explanation. Your statement:
the CORE namespace has search precedence.
raises a new question: How, then, does the original code ever find the print sub defined in namespace main if the sub isn’t explicitly qualified with its namespace (i.e., main::print)? Why doesn’t Perl always find CORE::print?
I think I found the answer: the original code works only because it uses a reference to the sub:
-command=> \&print
and in this case the reference is disambiguated using lexical scope. I found an explanation of the latter in the Camel Book, 4th Edition, “Name Lookups,” pages 62–65. Is there any documentation on how Perl looks up subroutine names when a subroutine is actually called (as opposed to being referenced)?
Thanks,
Athanasius <°(((>< contra mundum
| [reply] [d/l] |
Thank you. I've tried this code and it is allowing inputs other than numbers (positive or negative). I'd like to limit the entry options to only positive or negative integers. | [reply] |
this code ... is allowing inputs other than numbers
Not so! For the record, here is the exact code I am running (using Strawberry perl v5.16.0 built for MSWin32-x86-multi-thread-64int, running under Windows Vista 32-bit, and with Tk 804.030):
#! perl
use strict;
use warnings;
use Tk;
my $value;
my $mw = new MainWindow;
my $ent = $mw->Entry(-textvariable => \$value,
-validate => 'key',
-validatecommand => sub { $_[0] =~ /^(?:|-|\d+|-\
+d+)$/ },
-invalidcommand => \&lam_num_error)->pack();
my $print_button = $mw->Button(-text => "Print",
-command => \&printx,
-font => "ansi 10 bold")->pack();
my $reset_frm = $mw->Frame();
$reset_frm->pack(-fill => 'both');
my $reset_button = $reset_frm->Button(-text => "Reset",
-command => \&do_reset,
-font => "ansi 10 bold")->pac
+k();
MainLoop;
sub printx
{
print $value unless $value eq '-';
}
sub do_reset
{
$ent->delete(0, 'end');
}
sub lam_num_error
{
$mw->messageBox(-message => "The input must be an integer.");
}
__END__
This lets me enter -42, 763, etc., but if I try to enter a letter, or a punctuation symbol, or a minus sign anywhere after the first character, or even a space, I immediately get the message “The input must be an integer.” and my input never makes it into the Entry box. In other words, the code is working exactly as required.
Athanasius <°(((>< contra mundum
| [reply] [d/l] |
I apologize Athanasius. It does do exactly what you say. Thank you very much for being so helpful! :-)
| [reply] |