Perl:你能在 map 函数中使用两个以上的数组吗?
Perl: Can you use more than two arrays in the map function?
我最近一直在学习 Perl,并且 运行 遇到了一个有趣的问题。我将如何像这样在地图中使用两个数组?
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'
}
]
};
我想做的是以产生这些结果的方式处理地图
$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
的主体使用两个数组,因此您只需为其提供索引。
为此,两个 arrayrefs 必须具有相同的长度,并且项目必须在相同的索引处配对。
语法 $#$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;
我最近一直在学习 Perl,并且 运行 遇到了一个有趣的问题。我将如何像这样在地图中使用两个数组?
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'
}
]
};
我想做的是以产生这些结果的方式处理地图
$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
的主体使用两个数组,因此您只需为其提供索引。
为此,两个 arrayrefs 必须具有相同的长度,并且项目必须在相同的索引处配对。
语法 $#$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;