最近のものだと、Damian先生の"Perl Best Practice"のpp.199がこれに触れています。

結城浩のはてな日記
ここから「return undefするな、return ()せよ」というTipsが……っていうのは最近どこかのページで読んだ話題なんだけれど、思い出せない。YAPCのどこかだっただろうか。

YAPCでは、本書にある256のBest Practicesのうち、11に触れたのですが、その11の中にこれも入ってました。

Use a bare return to return failure
返り値で失敗を報告する時は、裸の return をもってせよ

偽の意味でundefをreturnしない、というTipsはよいのですが、うまい例が作れない……。

それでは拙者が。

#!/usr/local/bin/perl -l
use strict;
use warnings;
sub is_leap_year{
    my $year = shift;
    return 1 if $year % 400 == 0;
    return 0 if $year % 100 == 0;
    return 1 if $year %   4 == 0;
    return 0;
}
sub days_in_month{
    my ($year, $month) = @_;
    return undef if $month <  0; # OUCH!
    return undef if $month > 11; # YIKES!
    my @days_in_month = 
        ( 31, is_leap_year($year) ? 29 : 28, 31, 30, 31, 30, 
          31,                            31, 30, 31, 30, 30);
    my $lastday = $days_in_month[$month];
    return wantarray ? (1..$lastday) : $lastday;
}
my ($year, $month) = @ARGV;
my @days = days_in_month($year, $month) or die "No such month: $month";
$, = ","; # $OFS if use English;
print days_in_month(@ARGV);
__END__

このプログラム、月は一引かないといけないので、12月に関しては script.pl 2006 11 とかやらないと行けないのですが、script.pl 2006 12 とやってしまってもdieしません。

ただし、use warnings;のおかげで、辛うじてUse of uninitialized value in print at return.pl line 24.という警告は出ますが、これも真の原因はprintではなくYIKES!の行です。

return undef if $comment->is_spam(); # YIKES!
return undef if $trackback->is_spam(); # YIKES!

逆に、以下のような場合、undefは非常に役に立ちます。failureでない例です。

sub office_is_open{
  #       sun    mon     tue     wed     thu     fri     sat
  return (undef, [9,17], [9,17], [9,17], [9,17], [9,17], undef);
}

Happy returning!

Dan the returning Man to Reality