3

私はこれを持っています:

%lookup = (
    'Shelf' => { storage_types => 'Flat, Default' },
    'Locker' => { storage_types => 'Valuable' },
);

私はこれを取得したい:

%reverse_lookup = (
    'Flat' => 'Shelf',
    'Default' => 'Shelf',
    'Valuable' => 'Locker',
);

たとえば、テストでストレージの種類を循環させ、サブルーチンが正しい場所を返すことを確認できます。

複数リストの展開部分がわかりません。

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

foreach ループではなく、map などを使用してすべてを簡潔に実行したいと考えています。

4

5 に答える 5

5

内部のリストではなく、%lookup ハッシュの要素を反復処理するため、単一のマップではそれを行うことはできません。その場合、出力ハッシュにはソース ハッシュと同じ数のキーが含まれます。

ただし、ネストされたマップを使用できます。最初にメインのハッシュ要素を反復し、2 番目に内部のリストを反復します。

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;  

PS そして foreach の何が問題なのですか? :)

于 2012-08-10T13:46:27.450 に答える
2

元のハッシュを次のように変更する方が簡単な場合があります。

%lookup = (
    'Shelf' => { storage_types => [ 'Flat', 'Default'] },
    'Locker' => { storage_types => ['Valuable'] },
);

それで

%reverse_lookup = map {
       my $key = $_; 
       #$_ => $key foreach @{$lookup{$key}};
       map { $_ => $key } @${lookup{$key}};
    } keys %lookup;
于 2012-08-10T13:40:49.983 に答える
1

void コンテキストでの map の無駄な使用 (さらにはそれよりも愚かなこと) を気にしない限り、1 つのマップでこれを実行できることがわかりました。

map { @reverse_hash{split /,\s*/, $lookup{$_}} = ($_x100) } keys %lookup;

簡潔ですが。そして、それも機能します!

于 2012-08-10T14:25:07.997 に答える
1

のみに興味があり、storage_types判読できないコードが必要な場合は、次を試すことができます。

%reverse_lookup = map { my $k = $_; map { $_ => $k } split /,\s*/, $lookup{$_}{storage_types} } keys %lookup;
于 2012-08-10T13:46:49.903 に答える
0

これは私がそれをコーディングする方法です

use strict;
use warnings;

my %lookup = (
  Shelf => { storage_types => 'Flat, Default' },
  Locker => { storage_types => 'Valuable' },
);

my %reverse_lookup;

while ( my ($item, $info) = each %lookup ) {
  my @types = split /,\s*/, $info->{storage_types};
  $reverse_lookup{$_} = $item for @types;
}

use Data::Dump;
dd \%reverse_lookup;

出力

{ Default => "Shelf", Flat => "Shelf", Valuable => "Locker" }
于 2012-08-10T18:25:41.643 に答える