为什么map返回一个空数组?

时间:2009-07-21 18:25:44

标签: perl dictionary

我在Perl中遇到问题我不明白。我把它剥离了这个非常简短的代码。

为什么Perl的 map 函数返回一个空数组?它不应该返回一个包含9 undef s?

的数组
sub mySub{
    return;
}

my @arr = (1 .. 9);
my @arr2 = map( mySub($_), @arr );

print @arr . ' ' . @arr2, "\n";

打印“9 0”。

这可能很简单,但 perldoc 没有帮助。

3 个答案:

答案 0 :(得分:8)

对你的问题更一般的答案是这样的:当return没有参数使用时,它返回的值取决于调用上下文:

list context    returns an empty list
scalar context  returns an undefined value

例如:

use strict;
use warnings;
use Data::Dumper;

my (@list);
sub mySub { return }
@list = map(       mySub($_), 1..2); print Dumper(\@list);
@list = map(scalar mySub($_), 1..2); print Dumper(\@list);

输出:

$VAR1 = [];
$VAR1 = [
          undef,
          undef
        ];

答案 1 :(得分:7)

您的子程序返回undef,它返回一个空列表。 9次,空列表仍然是一个空列表。

尝试显式返回undef,输出会有所不同。

答案 2 :(得分:3)

试试这个

use strict;
use warnings;

sub mySub{
    return undef;
}

my @arr = (1,2,3,4,5,6,7,8,9);
my @arr2 = map(&mySub, @arr);

print @arr." ".@arr2;

如果需要获取包含undefs的列表,则需要显式返回undef。问题是map在数组上下文中调用mySub(检查wantarray从这个sub中提供了什么)。每次调用sub时,return语句基本上都会返回一个空列表,这会导致总数为空数组