On Mon, Jul 11, 2005 at 05:33:26PM -0400, David Golden wrote:
> http://rt.cpan.org/NoAuth/Bug.html?id=11304
>
> My suggestion turns on the question of whether it's possible to
> differentiate the context between a true boolean context ( "foo() if $p
> || $q" ) and a "pseudo-boolean" context that is really part of an
> assignment ( "my $foo = $p || $q" ) or just a standalone statement ( "$p
> || print $q" ).
"my $foo = $p || $q" is not boolean. I'm not even sure you can call it
"pseudo-boolean" without understanding the surrounding code. How do you
know that $q can never be false?
The other examples in the ticket play out the same way:
bless {}, ref $class || $class;
$class being false would be quite the error. Devel::Cover can't know that
in most cases you want to ignore the 0 || 0 case because you assume $class
to always be some true value and don't think its worth testing that it
might be false.
> Want.pm seems to imply that this might be possible, but I don't know the
> guts of Perl well enough. The concept I had was that *EXCEPT* in true
> boolean context, the "$p || $q" idiom is (I think) pretty much logically
> equivalent to a trinary operation "$p ? $p : $q" (ignoring potential
> side effects) and thus the truth table in this situation only needs to
> include the first operand, thus avoiding the false-alarm.
That assumption only works in void context.
# Don't care about the return value of die.
open FILE, $foo || die $!;
# DO care about what $q is
foo( $p || $q );
And the special ||= case:
$p ||= $q;
--
Michael G Schwern [EMAIL PROTECTED] http://www.pobox.com/~schwern
Reality is that which, when you stop believing in it, doesn't go away.
-- Phillip K. Dick