这个子死了:
sub _log {
foreach(@_) {
print $_ . "\n";
}
#return 1; # This fixes it but I want to understand the why
}
_log("log something") || die "I died";
此子中的打印返回1,但子本身返回''。我以为foreachs会返回其中最后一个语句的返回。情况绝对不是这样。
为什么这个子回归1?
答案 0 :(得分:4)
foreach
评估的值实际上是未定义的行为 - 文档does not mention任何返回值。始终使用明确的return
来避免此类错误,并且不要依赖while
,for
或if
等语句级构造的值。
实际上,这样的构造确实具有一致的返回值 - 最后评估的值。例如,foo() if bar()
的编译方式与bar() and foo()
相同,后者确实有明确定义的返回值。
答案 1 :(得分:1)
foreach
永远不会产生结果,所以带有foreach的子结尾将返回就像带有return;
的子结尾,即标量上下文中的undef
(如本示例所示) )和列表上下文中的空列表。