【问题标题】:Perl: Can you use more than two arrays in the map function?Perl:你可以在 map 函数中使用两个以上的数组吗?
【发布时间】:2021-08-03 04:50:02
【问题描述】:

我最近一直在学习 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'
                          }
                        ]
        };

【问题讨论】:

    标签: arrays perl dictionary


    【解决方案1】:
    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);
        ]
    };
    

    【讨论】:

      【解决方案2】:

      首先,这是没有意义的:

      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
      

      【讨论】:

      • 加号 + 符号在这种情况下是什么意思?
      【解决方案3】:

      这可能最好写成一个while循环:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-23
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 2022-07-20
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        相关资源
        最近更新 更多