反转数组的散列

时间:2015-09-02 12:49:23

标签: arrays perl hash perl-data-structures

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

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

我想将其转换为搜索并替换正则表达式。

E.g。

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/;

所以我可以:

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

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

到目前为止,我已经:

my %colour_map ;
foreach my $colour ( keys %replace ) {
   foreach my $value ( @{$replace{$colour}} ) {
        $colour_map{$value} = $colour;
   }
}

我认为应该使用像map这样的解决方案,但我无法理解。

4 个答案:

答案 0 :(得分: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;

输出

{
  active    => "008000",
  assertion => "FF0000",
  error     => "FF0000",
  errors    => "FF0000",
  paused    => "FFFF00",
  warning   => "FFFF00",
  warnings  => "FFFF00",
}

答案 1 :(得分:3)

您可能希望在此处使用双map

my %result = map { 
    my $k = $_;
    map { ( $_ => $k ) } @{$transform{$_}}
} keys %transform;

由于我们要在map内调用map,因此必须将上下文变量保存为词法。但是,对于来自pairmapList::Util

,情况并非如此
use List::Util qw<pairmap>;
...
my %result = pairmap { map { ( $_ => $a ) } @$b } %transform;

...因为$a$b已经设置为本地变量。

答案 2 :(得分:3)

不能说我会建议这样做,但是可以使用哈希切片对单个地图进行操作。

my %color_map = (); # merica
map { @color_map{ @{ $transform{ $_ } } } = ($_) x @{ $transform{ $_ } } } keys %transform;

答案 3 :(得分:1)

使用数组引用而不是数组定义原始颜色关键字映射,因为perl不会创建您期望的哈希。

dirs=(
    /home/user/Desktop
    ...
    /home/user/foo, bar
)

<强>输出

#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

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

my %color_map = map {
    my ($color) = $_;
    map { $_ => $color } @{ $transform{$color} };
} keys %transform;

print "Original Hash\n";
print Dumper \%transform;
print "Colormap from Hash\n";
print Dumper \%color_map;