为什么这个(大部分)空的Perl子例程返回一个空字符串?

qnt*_*ntm 9 perl

这是一个Perl程序:

use strict;
use warnings;

use Data::Dumper;

sub f {
  foreach (()) { }
}

print Dumper(f());
Run Code Online (Sandbox Code Playgroud)

这输出:

$VAR1 = '';
Run Code Online (Sandbox Code Playgroud)

由于没有显式返回值f,并且没有在其中计算表达式,结果不应该是undef?空字符串来自哪里?

Leo*_*erd 13

它还没有完全返回空字符串; 它返回了"false",一个内部Perl值(称为PL_no).这个假值在数字上为零,但却是空的.Data::Dumper不能直接表示它PL_no,因此选择一个可行的表示.

您可以通过其他方式生成它:

$ perl -MData::Dumper -E 'say Dumper(1 eq 2)'
$VAR1 = '';
Run Code Online (Sandbox Code Playgroud)


Thi*_*Not 6

由于没有显式返回值f,并且没有在其中计算表达式,结果不应该是undef

不.perldoc perlsub说返回值未指定:

如果return找不到,并且最后一个语句是表达式,则返回其值.如果最后一个语句是一个循环控制结构,如a foreach或a while,则返回的值未指定.

"未指定"是"我们不会记录确切行为的简称,因为我们可以随时更改它,您不应该依赖它." 现在,它PL_no按照LeoNerd的解释返回; 在未来的Perl版本中,它可以返回undef,或者完全不同的东西.