1use Contextual::Return; 2 3sub bar { 4 return 'in bar'; 5} 6 7sub foo { 8 return 9 BOOL { 0 } 10 LIST { 1,2,3 } 11 NUM { 42 } 12 STR { 'forty-two' } 13 SCALAR { 86 } 14 SCALARREF { \7 } 15 HASHREF { { name => 'foo', value => 99} } 16 ARRAYREF { [3,2,1] } 17 GLOBREF { \*STDERR } 18 CODEREF { \&bar } 19 CLEANUP { Other::ok(1 => 'CLEANUP') } 20 ; 21} 22 23package Other; 24use Test::More tests=>27; 25 26is_deeply [ ::foo() ], [1,2,3] => 'LIST context'; 27 28is do{ ::foo() ? 'true' : 'false' }, 'false' => 'BOOLEAN context'; 29 30is 0+::foo(), 42 => 'NUMERIC context'; 31 32is "".::foo(), 'forty-two' => 'STRING context'; 33 34is ${::foo}, 7 => 'SCALARREF context'; 35 36is_deeply \%{::foo()}, 37 { name => 'foo', value => 99} => 'HASHREF context'; 38 39is_deeply \@{::foo()}, [3,2,1] => 'ARRAYREF context'; 40 41is \*{::foo()}, \*STDERR => 'GLOBREF context'; 42 43is ::foo->(), 'in bar' => 'ARRAYREF context'; 44 45$foo = ::foo(); 46 47is ${$foo}, 7 => 'SCALARREF via var'; 48 49$foo = undef; 50 51my ($void, $tested); 52sub side_effect { 53 use Contextual::Return; 54 return 55 BOOL { $tested = 1 } 56 VOID { $void = 1 } 57 CLEANUP { $_ = 42 if $tested } 58}; 59 60side_effect(); 61 62is $void, 1 => 'SIDE EFFECT VOID'; 63ok !defined $_ => 'NO ASSIGNMENT TO $_'; 64 65undef $void; 66 67my $side_effect = side_effect(); 68ok !defined $void => 'SIDE EFFECT NONVOID'; 69ok !defined $_ => 'NO ASSIGNMENT TO $_'; 70 71ok side_effect() => 'SIDE EFFECT BOOLEAN'; 72ok !defined $void => 'SIDE EFFECT BOOLEAN NONVOID'; 73is $_, 42 => 'ASSIGNMENT TO $_'; 74