我在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 没有帮助。
答案 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语句基本上都会返回一个空列表,这会导致总数为空数组