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