Perl 为什么map返回空数组?

Perl 为什么map返回空数组?,perl,dictionary,Perl,Dictionary,我的Perl有个问题,我不懂。我把它简化为这个非常短的代码 为什么Perl的map函数返回空数组?它不应该返回一个带有9undes的数组吗 sub mySub{ return; } my @arr = (1 .. 9); my @arr2 = map( mySub($_), @arr ); print @arr . ' ' . @arr2, "\n"; 它打印“90” 这可能很简单,但perldoc没有帮助。您的子例程返回的是未定义,它返回的是一个空列表。9次,空列表仍然是空列表

我的Perl有个问题,我不懂。我把它简化为这个非常短的代码

为什么Perl的
map
函数返回空数组?它不应该返回一个带有9
unde
s的数组吗

sub mySub{
    return;
}

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

print @arr . ' ' . @arr2, "\n";
它打印“90”


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

您的子例程返回的是未定义,它返回的是一个空列表。9次,空列表仍然是空列表

尝试显式返回undef,输出将不同。

尝试此操作

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;

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

对于您的问题,更一般的答案是:当使用
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
        ];

不,您将得到一个包含9个空列表的列表。jiggy:我认为您不能在perl中拥有列表列表。Perl列表都是“平面”和“一维的”。@karel,Perl可以将数据结构嵌套到任意深度和复杂性(请参阅)。第二,尽管曼尼的答案(令人惊讶地)确实给出了所需的输出,但它并没有按照您的想法工作。运行以下命令:my@arr2=map(未定义,@arr);你会得到同样的结果,和什么一样?jiggy:是的,perl有n维的列表,但是为了得到它,你必须从mySub返回一个列表引用,例如“return[];”,否则列表会被压平。nonono,我的代码只是一个愚蠢的例子,什么都没有做。我不想做你们描述的,我只想有一个9个未定义的列表。但不管怎样,谢谢你。这是为什么?这是最明智的回答。谢谢。。。。问题是,我不知道map在列表上下文中调用它。(在perl中,这个标量/列表上下文概念有时仍然让我感到困惑:)