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

时间:2015-07-16 19:01:08

标签: perl

这是一个Perl程序:

use strict;
use warnings;

use Data::Dumper;

sub f {
  foreach (()) { }
}

print Dumper(f());

输出:

$VAR1 = '';

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

2 个答案:

答案 0 :(得分:13)

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

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

$ perl -MData::Dumper -E 'say Dumper(1 eq 2)'
$VAR1 = '';

答案 1 :(得分:6)

  

由于f没有明确返回任何值,并且没有在其中评估任何表达式,结果应该是undef吗?

不。 perldoc perlsub表示返回值未指定:

  

如果未找到return且最后一个语句是表达式,则返回其值。如果最后一个语句是循环控制结构,如foreachwhile,则返回的值未指定。

"未指定"是"我们不会记录确切的行为,因为我们可以随时更改它,你不应该依赖它。"现在,它将PL_no作为LeoNerd explained返回;在未来的Perl版本中,它可能会返回undef或其他一些东西。