如何反转具有复杂值的哈希?

Wil*_*ard 3 algorithm perl foreach hashmap map

我有这个:

%lookup = (
    'Shelf' => { storage_types => 'Flat, Default' },
    'Locker' => { storage_types => 'Valuable' },
);
Run Code Online (Sandbox Code Playgroud)

我想得到这个:

%reverse_lookup = (
    'Flat' => 'Shelf',
    'Default' => 'Shelf',
    'Valuable' => 'Locker',
);
Run Code Online (Sandbox Code Playgroud)

例如,我可以在测试中循环访问存储类型,并检查子例程是否返回正确的位置.

我无法理解多列表扩展部分.

%reverse_lookup = map { split(/,\s*/, $lookup{$_}) => $_ } keys %lookup; # wrong
Run Code Online (Sandbox Code Playgroud)

我想简单地使用地图或类似的东西,而不是foreach循环.

fil*_*nov 5

你不能用单一地图做到这一点,因为它迭代了%lookup hash的元素,而不是遍历里面的列表.因此,在这种情况下,您将在输出哈希中使用与源哈希中相同数量的键.

但是你可以使用嵌套映射 - 首先迭代主哈希元素,第二个迭代列表里面.

my %lookup = (
    'Shelf' => { storage_types => 'Flat, Default' },
    'Locker' => { storage_types => 'Valuable' },
);
my %reverse_lookup = map { my $key_name = $_; map {$_ => $key_name} (split(/,\s*/, $lookup{$_}->{storage_types})) } keys %lookup;

use Data::Dumper; print Dumper \%reverse_lookup;  
Run Code Online (Sandbox Code Playgroud)

PS和foreach有什么不对?:)