return; と return undef; の違い

use strict;
use warnings;
use Smart::Comments;

my %n = (val=>return_nothing());
my %u = (val=>return_undef());
### %n
### %u

sub return_nothing{
  return;
}
sub return_undef{
  return undef;
}
$ perl a.pl
Odd number of elements in hash assignment at /home/tmp/a.pl line 5.

### %n: {
###       val => undef
###     }
### %u: {
###       val => undef
###     }

ただの return; だと、ハッシュの初期化に使った場合 "Odd number of elements in hash assignment" などという警告が出るみたい。

結果はどっちでも同じなんだけど、明示的にreturn undef;としておいたほうが良い(場合もある)みたい。

追記

調べてみると結構おなじようなこと考えてる人がいた。

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

404 Blog Not Found:perl - (undef) is true

ふーむ。

print "return_nothing is " . ((return_nothing()) ? "TRUE" : "FALSE") . "\n";
print "return_undef is " . ((return_undef()) ? "TRUE" : "FALSE") . "\n";
return_nothing is FALSE
return_undef is FALSE
$ perl -v
This is perl 5, version 22, subversion 2 (v5.22.2) built for cygwin-thread-multi

ふーむ。。

return undefしてもfalseになるっぽいけど、バージョン依存なんだろうか。

まあ何にせよ、成功・失敗を返り値で判断するような場合はただのreturn、値を返すときはreturn undefと使い分ける感じが良いということかな。