in reply to RE: RE (tilly) 2: What are all the false values in Perl ((conditional
in thread What are all the false values in Perl ((conditional, boolean, whitespace, unprintable characters)

I completely agree that the so-called "list" in tilly's example is better referred to as "use of the comma operator". I also (think that I mostly) agree with the statement that "an empty list is false". I can't come up with a (non-contrived) situation where that is not the case. But I think that phrase is on a slippery slope to much confusion.

The term "list" has no formal definition in Perl lingo. This is a source of much confusion for people ranging from Perl newbie to the Perl illuminati. The problem is made worse by several knowledgeable people talking as if there was a formal meaning (including in the Perl standard documentation where "list" is used to mean contradictory things without noting that "list" on one page may not be talking about the same thing as an occurrance of "list" on another page). This is also made worse because the terms "list context", "scalar context", and "scalar" all have formal meanings in Perl (which makes it easy to infer that "list" would also have a formal meaning).

I'll also disagree that boolean evaluation provides a void context. It provides a scalar context as proven by:

sub want { if( ! defined wantarray ) { warn "void context\n"; } elsif( ! wantarray ) { warn "scalar context\n"; } else { warn "array context\n"; } return 1; } if( want ) { # scalar context print want,"\n"; # array context } want; # void context __END__ This prints: scalar context array context 1 void context

Note that scalar context has several "subcontexts" that wantarray can't detect. These include "scalar" ($x= want), "string" ($x= "".want), "numeric" ($x=  0+want), "integer" ($x= 0|want), and "boolean" ($x= !want). It is a bit of a stretch to call these "contexts" with any current version of Perl because most operators don't know which of these contexts they are in.

Finally, I have to disagree with the statement that "a non-empty list is true". This is further down the slope of confusion. There are so many things that could be called "a non-empty list". Many of those will yield a true value in a boolean context. But there are many operations that would return a non-empty list in a list context but would return a false value in a boolean context. tilly gives one example. Perhaps this is a better example:

my @array=(-1,0,1); print "true\n" if @array[0,2,1];
which doesn't print anything.

        - tye (but my friends call me "Tye")