Perl:你能在 map 函数中使用两个以上的数组吗?

lor*_*ork 3 arrays perl dictionary

最近我一直在学习 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;
Run Code Online (Sandbox Code Playgroud)

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

$VAR1 = {
          'Students' => [
                          {
                            'Model' => 'Bill',
                            'Name' => 'Bill'
                          },
                          {
                            'Model' => 'Smith',
                            'Name' => 'Smith'
                          },
                          {
                            'Model' => 'Honda',
                            'Name' => 'Honda'
                          },
                          {
                            'Model' => 'Toyota',
                            'Name' => 'Toyota'
                          }
                        ]
        };
Run Code Online (Sandbox Code Playgroud)

我想做的是让地图工作以产生这些结果的方式

$VAR1 = {
          'Students' => [
                          {
                            'Model' => 'Honda',
                            'Name' => 'Bill'
                          },
                          {
                            'Model' => 'Toyota',
                            'Name' => 'Smith'
                          }
                        ]
        };
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 6

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;
Run Code Online (Sandbox Code Playgroud)

的主体map使用两个数组,因此您只需要为其提供索引。

为此,两个数组引用必须具有相同的长度,并且要在相同索引处配对的项目。

语法$#$arrayref适用于 中的最后一个索引$arrayref,因为在这里我们还必须首先取消引用,所以有一对额外的{}.


你所拥有的取消引用两个数组引用,为 构建一个单一的平面列表map,产生

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


ike*_*ami 5

首先,这没有意义:

my $names->{name} = ['Bill', 'Smith'];
my $cars->{model} = ['Honda', 'Toyota'];
Run Code Online (Sandbox Code Playgroud)

我会用

my @names  = ( 'Bill', 'Smith' );
my @models = ( 'Honda', 'Toyota' );
Run Code Online (Sandbox Code Playgroud)

我们可以迭代索引。

map { +{ Name => $names[$_], Model => $cars[$_] } }
   0..$#names
Run Code Online (Sandbox Code Playgroud)

或者,我们可以征募zip.

use List::Util qw( zip );

map { +{ Name => $_->[0], Model => $_->[1] } }
   zip \@names, \@models
Run Code Online (Sandbox Code Playgroud)