Hi folks,
Not sure if this issue was raised before, so here I go.
I have a function like this in a (say "Foo") plugin:
sub bar {
my @a;
# ... compute @a
return wantarray ? @a : [EMAIL PROTECTED];
}
And from a template I needed to output some prefix ("Tags: ") and the
array values separated by commas. Obviously, if there were no elements
in the returned array, no output should occur.
I had this:
[% SET a = Foo.bar; IF a.size > 0 %]
Tags: [% FOREACH i = a;
', ' IF !loop.first;
i;
END; %]
To my surprise, when "@a" in that function was an empty array the
"Tags:" text was present in output.
After some hassling I understood that returning an empty array from a
function is equivalent to returning undef, which TT interprets as an
empty string (and empty_string.size == 1 because.. err... that's written
in the manual but it doesn't make too much sense so I forgot why).
I'm not sure who's at guilt here: Perl, for deciding that an empty array
means "undef", TT for deciding that a scalar must have .size == 1, or me
for being dumb enough to make functions that return an array or an
arrayref depending on how they're called (but let's just say it's too
late to fix the latter).
A simple solution (for this particular case) is to check "IF a" instead
of "IF a.size > 0". Empty strings evaluate to "false" in conditionals,
so it works fine. However, it's not an "universal" solution because if
I have a function that always returns an arrayREF, then the empty array
will evaluate to "true".
Of course, the definitive solution is "IF a && a.size > 0" but this
looks ugly to say the least. So I was thinking to suggest to make TT
evaluate empty arrays (REF-s, that is) to "false" in conditionals, same
as it does with empty strings. Makes sense?
Thanks,
-M.
_______________________________________________
templates mailing list
[email protected]
http://lists.template-toolkit.org/mailman/listinfo/templates