[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Omaha.pm] The many faces of return;



I got hung up on "return false" today. Apparently "return false" is common lingo for return; or return (); which are both guaranteed to be false in scalar or array context. As opposed to return undef; or return 0; which are false in scalar context, but true in array context.

Fun, huh?   :)

j




$ cat perl_return_and_context.t
use Test::More tests => 8;

foreach my $sub (qw(
   return_0 return_undef return_empty_list return_semi_colon
)) {
   my $ret = &$sub();
   ok(! $ret,       "$sub in scalar context");
   my @ret = &$sub();
   ok(! @ret,       "$sub in array context");
   &$sub();
}

sub return_0 {
   #print_context(wantarray);
   return 0;
}
sub return_undef {
   #print_context(wantarray);
   return undef;
}
sub return_empty_list {
   #print_context(wantarray);
   return ();
}
sub return_semi_colon {
   #print_context(wantarray);
   return;
}


sub print_context {
   my ($wantarray) = @_;
   if (not defined $wantarray) {
      print "[void]";
   } elsif ($wantarray) {
      print "[list]";
   } else {
      print "[scalar]";
   }
}


$ perl perl_return_and_context.t
1..8
ok 1 - return_0 in scalar context
not ok 2 - return_0 in array context
#   Failed test 'return_0 in array context'
#   at perl_return_and_context.t line 9.
ok 3 - return_undef in scalar context
not ok 4 - return_undef in array context
#   Failed test 'return_undef in array context'
#   at perl_return_and_context.t line 9.
ok 5 - return_empty_list in scalar context
ok 6 - return_empty_list in array context
ok 7 - return_semi_colon in scalar context
ok 8 - return_semi_colon in array context
# Looks like you failed 2 tests of 8.