为何Perl中未显式返回值的函数会存在已定义值?
为什么未显式返回值的Perl函数会返回已定义值?
嘿,这个问题其实是Perl函数的默认返回规则在搞鬼,我给你拆解清楚:
首先你得知道,Perl里的函数默认会返回最后一条执行语句的结果,不管你有没有写return关键字。
看你的测试代码:
perl -le 'sub xxx { print 2; } print defined(xxx);'
当你调用xxx()时,函数里执行的最后一条语句是print 2;——而print这个函数的返回值是什么呢?如果print成功输出内容,它会返回1;只有当输出失败(比如文件句柄关闭、权限问题)时,才会返回undef。
你的例子里print 2成功输出了2,所以这条语句的返回值是1,这个值就成了xxx()函数的默认返回值。接下来defined(xxx)判断的就是这个1,自然会返回1,所以最终控制台输出2 1。
如果想让函数返回undef,有两种方式:
- 显式写
return undef;,比如:perl -le 'sub xxx { print 2; return undef; } print defined(xxx);' - 让函数最后一条语句返回
undef,比如:perl -le 'sub xxx { print 2; undef; } print defined(xxx);'
这两种写法都会让defined(xxx)返回0,符合你最初的预期。
顺带提一句,Perl的这个默认返回特性其实很常用——很多Perl程序员会利用它简化代码,比如写一个获取哈希值的函数:
sub get_user_name { $user_info{name}; }
不用写return,直接让最后一条语句的结果作为返回值,简洁又高效。
内容的提问来源于stack exchange,提问作者Ricardo Lucca
相关产品推荐
相关产品推荐

