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但我无法弄清楚.
我不会为了它而过分专注于"使用类似的东西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)