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

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

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