在map函数中可以使用两个以上的数组吗?



我最近一直在学习Perl,并且遇到了一个有趣的问题。如何在map中使用两个数组呢?

use warnings;
use strict;
use Data::Dumper;
my $names->{name} = ['Bill', 'Smith'];
my $cars->{model} = ['Honda', 'Toyota'];
my $obj = {
'Students' => [
map {
'Name' => $_, 
'Model' => $_ 
}, @{$names->{name}}, @{$cars->{model}}
]
};
print Dumper $obj;

这将打印,它产生的对象比我想要的多两个。

$VAR1 = {
'Students' => [
{
'Model' => 'Bill',
'Name' => 'Bill'
},
{
'Model' => 'Smith',
'Name' => 'Smith'
},
{
'Model' => 'Honda',
'Name' => 'Honda'
},
{
'Model' => 'Toyota',
'Name' => 'Toyota'
}
]
};

我想做的是让map工作在某种程度上产生这些结果

$VAR1 = {
'Students' => [
{
'Model' => 'Honda',
'Name' => 'Bill'
},
{
'Model' => 'Toyota',
'Name' => 'Smith'
}
]
};
use warnings;
use strict;
use Data::Dumper;
my $names->{name} = [ qw(Bill Smith) ];
my $cars->{model} = [ qw(Honda Toyota) ];
my $obj = { 
Students => [
map {
{ Name => $names->{name}[$_], Model => $cars->{model}[$_] }
} 
0 .. $#{$names->{name}}
]   
};      

print Dumper $obj;

map的主体使用两个数组,所以您只需要为它提供索引。

对于这种情况,两个数组必须具有相同的长度,并且条目必须在相同的下标处配对。

语法$#$arrayref用于$arrayref中的最后一个索引,由于这里我们必须首先解引用,因此有一对额外的{}


你有什么对两个数组的引用,为map构建一个单一的平面列表,产生

my $obj = {
'Students' => [
map {
'Name' => $_, 
'Model' => $_ 
}, qw(Bill Smith Honda Toyota);
]
};

首先,这没有意义:

my $names->{name} = ['Bill', 'Smith'];
my $cars->{model} = ['Honda', 'Toyota'];

我将使用

my @names  = ( 'Bill', 'Smith' );
my @models = ( 'Honda', 'Toyota' );

可以遍历索引

map { +{ Name => $names[$_], Model => $cars[$_] } }
0..$#names

或者,我们可以招募zip

use List::Util qw( zip );
map { +{ Name => $_->[0], Model => $_->[1] } }
zip @names, @models

这可能更适合写成while循环:

my @names  = qw( Bill  Smith  );
my @models = qw( Honda Toyota );
my @students;
push @students, { 'name' => shift @names, 'model' => shift @models } while @names;

相关内容

  • 没有找到相关文章

最新更新