Anyone Know Why Perl Does This?
Joel Meulenberg
joelmeulenberg at yahoo.com
Thu Jan 6 19:16:53 CST 2000
This problem affected some real code, but I've included a simpler
example (below) that illustrates the behavior. The difference between
the two loops below is the location of the declaration of the
lexically-scoped (i.e.- "my") $i variable. Here's the example code:
#!/usr/local/bin/perl -w
use strict;
$|++;
{
my $counter = 0;
sub reset_counter { $counter = 0; }
sub fetch_next { return $counter < 5 ? ++$counter : undef; }
}
{
print "With lexical variable declared in while expression.\n";
&reset_counter();
while (my $i = &fetch_next()) {
print "(in while block) i = $i\n";
next if $i == 3;
} continue {
print "(in continue block) i = $i\n";
}
}
{
print "\nWith lexical variable declared in block containing while
loop.\n";
&reset_counter();
my $i;
while ($i = &fetch_next()) {
print "(in while block) i = $i\n";
next if $i == 3;
} continue {
print "(in continue block) i = $i\n";
}
}
When reviewing the output below, note how in the 3rd iteration of the
first loop while executing the line "next if $i == 3;" (line 16), Perl
suddenly thinks that $i is uninitialized. Why? As a result, $i has an
undefined value in the continue block for the 3rd iteration. Here's
the output:
With lexical variable declared in while expression.
(in while block) i = 1
(in continue block) i = 1
(in while block) i = 2
(in continue block) i = 2
(in while block) i = 3
Use of uninitialized value at j.pl line 16.
(in continue block) i =
(in while block) i = 4
(in continue block) i = 4
(in while block) i = 5
(in continue block) i = 5
With lexical variable declared in block containing while loop.
(in while block) i = 1
(in continue block) i = 1
(in while block) i = 2
(in continue block) i = 2
(in while block) i = 3
(in continue block) i = 3
(in while block) i = 4
(in continue block) i = 4
(in while block) i = 5
(in continue block) i = 5
Thanks.
+Joel
__________________________________________________
Do You Yahoo!?
Talk to your friends online with Yahoo! Messenger.
http://im.yahoo.com
More information about the grand-rapids-pm-list
mailing list