I used to think that unless
and if not
were fully equivalent, but this Q&A made me realize they can result in different output under list context:
use strict;
use warnings;
use Data::Printer;
use feature 'say';
my %subs = (
unless => sub {
my ( $value ) = @_ ;
return "$value is a multiple of 3"
unless $value % 3 ;
},
if_not => sub {
my ( $value ) = @_ ;
return "$value is a multiple of 3"
if not $value % 3 ;
},
);
for my $name ( keys %subs ) {
my $sub = $subs{$name};
say $name;
my @results = map { $sub->($_) } 1 .. 10;
p @results;
}
Output
if_not
[
[0] "",
[1] "",
[2] "3 is a multiple of 3",
[3] "",
[4] "",
[5] "6 is a multiple of 3",
[6] "",
[7] "",
[8] "9 is a multiple of 3",
[9] ""
]
unless
[
[0] 1,
[1] 2,
[2] "3 is a multiple of 3",
[3] 1,
[4] 2,
[5] "6 is a multiple of 3",
[6] 1,
[7] 2,
[8] "9 is a multiple of 3",
[9] 1
]
The code snippet above shows that unless
and if not
cause the subroutine to see different values of the last-evaluated expression.
It seems that this is because if not
considers not
to be part of EXPR
, whereas unless
doesn't consider it to be part of EXPR
.
Question
Are there any other examples of code usage where the two are not quite synonymous?