return;
вернет пустой список в контексте списка, но undef
в скалярном контексте.return undef;
всегда будет возвращать одно значение undef
даже в контексте списка.
В общем случае, обычно не рекомендуется return undef;
из подпрограммы, обычно используемой в контексте списка:
sub foo { return undef }
if ( my @x = foo() ) {
print "oops, we think we got a result";
}
Как правило, return;
обычно не очень хорошая идея для подпрограммы, обычно используемой в скалярном контексте, поскольку она не будет вести себя так, как ожидает пользователь в контексте списка:
sub foo { return }
%x = ( 'foo' => foo(), 'bar' => 'baz' );
if ( ! exists $x{'bar'} ) {
print "oops, bar became a value, not a key";
}
Обаиз этих ошибок на практике встречается совсем немного, а последний - тем более, возможно, потому, что подпрограммы, которые, как ожидается, вернут скаляр, встречаются чаще.И если ожидается, что он вернет скаляр, лучше вернуть скаляр.