首页 > 解决方案 > Perl:你可以在 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'
                          }
                        ]
        };

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

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

标签: arraysperldictionary

解决方案


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针对{}.


你有什么取消引用两个arrayrefs,为创建一个单一的平面列表map,产生

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

推荐阅读