我知道如果你这样做可能会发生冲突。但是给出了数组的哈希:
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
这样的解决方案,但我无法理解。
答案 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
,因此必须将上下文变量保存为词法。但是,对于来自pairmap
的List::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;