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

What does the !! mean? I thought it would be not not (in other words, true..)

Replies are listed 'Best First'.
Re^3: Elegant way to return true or nothing from a subroutine?
by fenLisesi (Priest) on Oct 10, 2006 at 16:00 UTC
    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.