缩短代码:从哈希合并数组

Dan*_*mer 0 perl refactoring perl-hash perl-data-structures

我有一个哈希列表,一些哈希包含一个提供数组本身的键.

my @cars = (
   { # empty car
      name => "BMW",
   },
   { # car with passengers
      name => "Mercedes",
      passengers => [qw(Paul Willy)],
   },
   ...
)
Run Code Online (Sandbox Code Playgroud)

它几乎就像上面但当然不是以愚蠢的汽车为例:-)

现在我需要从所有哈希中获得所有"乘客"的列表,包括那些甚至不提供乘客阵列的乘客.

在第二步中,我需要从列表中检索唯一条目(实际上乘客是Perl对象引用,我需要列表中的每个对象一次)

目前我这样做:

my (@all, @passengers, %seen);
for(@cars) {
    push @all, @{$_->{passengers}} if $_->{passengers};
}

@passengers = grep { ! $seen{$_} ++ } @all;
Run Code Online (Sandbox Code Playgroud)

我想摆脱@all并将所有乘客的名单直接扔进去grep.

有什么建议?

cjm*_*cjm 6

my %seen;
my @passengers = grep { ! $seen{$_} ++ }
                 map { @{$_->{passengers} || []} } @cars;
Run Code Online (Sandbox Code Playgroud)