反转数组的散列

Sob*_*que 2 arrays perl hash perl-data-structures

我知道如果你这样做可能会发生冲突.但是给出了数组的哈希:

my %transform = ( 
    'FF0000' => [qw ( error errors assertion )],
    'FFFF00' => [qw ( warning warnings paused )],
    '008000' => [qw ( active )],
);
Run Code Online (Sandbox Code Playgroud)

我想把它变成一个搜索并替换正则表达式.

例如

my %colour_map = ( 
   'error' => 'FF0000',
   'errors' => 'FF0000',
   'assertion' => 'FFFF00',
   'warning' => 'FFFF00',
   'warnings' => 'FFFF00',
   'paused' => 'FFFF00',
   'active' => '008000',
);

my $search = join( "|", map {quotemeta} keys %colour_map ); 
   $search = qr/\b($search)\b/;
Run Code Online (Sandbox Code Playgroud)

所以我可以:

while (<$fh>) {
    if ( my ($match) = m/$search/i ) {
        print "$colour_map{lc($match)} $match\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

我很可能存在潜在的冲突(给定数组不需要唯一性).

到目前为止我有:

my %colour_map ;
foreach my $colour ( keys %replace ) {
   foreach my $value ( @{$replace{$colour}} ) {
        $colour_map{$value} = $colour;
   }
}
Run Code Online (Sandbox Code Playgroud)

我认为应该有一个使用类似的解决方案,map但我无法弄清楚.

Bor*_*din 6

我不会为了它而过分专注于"使用类似的东西map".如果你在设计一个以这种方式运作的解决方案时遇到问题,那么当你设法将你的脚塞进拖鞋时,其他人可能会有理解它的作用的问题

我相信这是使用while迭代器和最简单最简单的方法each

像这样

use strict;
use warnings;

use Data::Dump;

my %transform = (
    'FF0000' => [qw ( error errors assertion )],
    'FFFF00' => [qw ( warning warnings paused )],
    '008000' => [qw ( active )],
);

my %colour_map;

while ( my ($key, $val) = each %transform ) {
    $colour_map{$_} = $key for @$val;
}

dd \%colour_map;
Run Code Online (Sandbox Code Playgroud)

产量

{
  active    => "008000",
  assertion => "FF0000",
  error     => "FF0000",
  errors    => "FF0000",
  paused    => "FFFF00",
  warning   => "FFFF00",
  warnings  => "FFFF00",
}
Run Code Online (Sandbox Code Playgroud)