【发布时间】:2015-11-27 23:46:42
【问题描述】:
我知道如果你这样做,可能会发生冲突。但是给定一个数组哈希:
my %transform = (
'FF0000' => [qw ( error errors assertion )],
'FFFF00' => [qw ( warning warnings paused )],
'008000' => [qw ( active )],
);
我想把它变成一个搜索和替换正则表达式。
例如
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 的解决方案,但我想不通。
【问题讨论】:
-
您将元字符添加到以下列表的可能性有多大:“错误”、“错误”、“断言”、“警告”、“警告”、“暂停”和“活动” ?鉴于趋势和建议的数据空间,我认为
quotemeta有点过头了,但这里可能存在商店标准。
标签: arrays perl hash perl-data-structures