use strict; use Benchmark qw (cmpthese); sub froutine { 0 } sub troutine { 1 } my $tests = { 'T 01' => sub {for (troutine()) { return $_ || last; } 0;}, 'F 01' => sub {for (froutine()) { return $_ || last; } 0;}, 'T 02' => sub {for (troutine()) { return $_ if $_; } 0;}, 'F 02' => sub {for (froutine()) { return $_ if $_; } 0;}, 'T 03' => sub {$_ and return $_ for troutine(); 0;}, 'F 03' => sub {$_ and return $_ for froutine(); 0;}, 'T 04' => sub {return $_ || last for troutine(); 0;}, 'F 04' => sub {return $_ || last for froutine(); 0;}, 'T 05' => sub {if (my $ret = troutine()) { return $ret }; 0;}, 'F 05' => sub {if (my $ret = froutine()) { return $ret }; 0;}, 'T 06' => sub {return $_ if local $_ = troutine(); 0;}, 'F 06' => sub {return $_ if local $_ = froutine(); 0;}, 'T 07' => sub {if (local $_ = troutine()) { return $_ }; 0;}, 'F 07' => sub {if (local $_ = froutine()) { return $_ }; 0;}, 'T 08' => sub {return $_ while (local $_ = troutine()); 0;}, 'F 08' => sub {return $_ while (local $_ = froutine()); 0;}, 'T 09' => sub {while (local $_ = troutine()) { return $_ }; 0;}, 'F 09' => sub {while (local $_ = froutine()) { return $_ }; 0;}, 'T 10' => sub {return $_ for troutine() or (); 0;}, 'F 10' => sub {return $_ for froutine() or (); 0;}, 'T 11' => sub {return $_ for grep $_, troutine(); 0;}, 'F 11' => sub {return $_ for grep $_, froutine(); 0;}, }; for my $key (keys %$tests) { $_ = 'test'; if ($key =~ /^T/) { die unless $tests->{$key}->(); } else { die if $tests->{$key}->(); } die unless $_ eq 'test'; } cmpthese(-1, $tests); cmpthese(-1, { 'T01' => sub {$tests->{'T 01'}->(); $tests->{'F 01'}->() }, 'T02' => sub {$tests->{'T 02'}->(); $tests->{'F 02'}->() }, 'T03' => sub {$tests->{'T 03'}->(); $tests->{'F 03'}->() }, 'T04' => sub {$tests->{'T 04'}->(); $tests->{'F 04'}->() }, 'T05' => sub {$tests->{'T 05'}->(); $tests->{'F 05'}->() }, 'T06' => sub {$tests->{'T 06'}->(); $tests->{'F 06'}->() }, 'T07' => sub {$tests->{'T 07'}->(); $tests->{'F 07'}->() }, 'T08' => sub {$tests->{'T 08'}->(); $tests->{'F 08'}->() }, 'T09' => sub {$tests->{'T 09'}->(); $tests->{'F 09'}->() }, 'T10' => sub {$tests->{'T 10'}->(); $tests->{'F 10'}->() }, 'T11' => sub {$tests->{'T 11'}->(); $tests->{'F 11'}->() }, } );