Confused about FOREACH and local variables

George <[email protected]> Thu, 3 Jul 2014 13:46:15 -0400
Newsgroups gmane.comp.lang.perl.modules.template-toolkit
Message-ID <[email protected]>
Hello.  I am confused about how local/global variables work within a FOREACH loop.  Consider this Perl program:

    use Template;
    my %data = (
        'presidents' => [
            {first_name => 'Bill', last_name  => 'Clinton'},
            {first_name => 'George'},
            {first_name => 'Barack', last_name  => 'Obama'},
        ],
    );
    my $tt = Template->new();
    $tt->process('test.html', \%data);


and this "test.html" file:


    [% FOREACH p IN presidents %]
    Name: [% p.first_name %] [% p.last_name %]<BR>
    [% END %]

    [% FOREACH presidents %]
    Name: [% first_name %] [% last_name %]<BR>
    [% END %]


From what I gathered on the Template::Manual::Directives page, the second FOREACH loop is just the short form of the first version.  And yet the output in the second case is unexpected:

    Name: Bill Clinton<BR>
    Name: George <BR>
    Name: Barack Obama<BR>

    Name: Bill Clinton<BR>
    Name: George Clinton<BR>
    Name: Barack Obama<BR>

In the first case, "George" has no last name, so no value is printed.  In the second case, it appears "George" inherits the "last_name" value from the previous iteration.

Is this the intended operation?