in reply to Elegant way to return true or nothing from a subroutine?

sub foo { return !! shift->{some_obj}->some_method; }

or even:

sub foo { !! shift->{some_obj}->some_method; }

DWIM is Perl's answer to Gödel

Replies are listed 'Best First'.
Re^2: Elegant way to return true or nothing from a subroutine?
by monarch (Priest) on Oct 10, 2006 at 15:34 UTC
    What does the !! mean? I thought it would be not not (in other words, true..)
      Ignoring non-integer values for brevity, the not not transformation maps 0 to 0 and everything else to 1:
      my @nums = (-2 .. 2); for my $num (@nums) { printf "!!%2d => %d\n", $num, !!$num; }
      gives
      !!-2 => 1 !!-1 => 1 !! 0 => 0 !! 1 => 1 !! 2 => 1
        Not quite. The not not transformation maps 0 to false and every other integer to 1. False acts as the nul string in string context, and acts as zero in numerical context.
        use warnings; my $false = !!0; my $numzero = 0; my $strzero = '0'; my $nulstr = ''; local $\ = "\n"; print 'false: ', $false; # '' <-- Not zero! print '0: ', $numzero; # '0' print "'0': ", $strzero; # '0' print "'': ", $nulstr; # '' print ''; print 'false: ', 0+$false; # '0' (no warning) print '0: ', 0+$numzero; # '0' (no warning) print "'0': ", 0+$strzero; # '0' (no warning) print "'': ", 0+$nulstr; # '0' with warning

        If you wanted something that maps 0 to 0 and every other integer to 1, you'd want 0 + !!$var.

        Update: Added $strzero. Minor cosmetic changes.