首页 > 解决方案 > 检查字符串的一部分是否存在于哈希表的键中

问题描述

我正在处理 perl 中的哈希表。

我有多个字符串,具有多个长度和多个-

pre1-pre2-text1-text2
pre3-text3
pre4-pre5-pre6-text4

我有%hash以下键:

pre1-pre2
pre3
pre4-pre5-pre6

所以键%hash只包含pre字符串的一部分。

如何检查假设第一个字符串pre1-pre2-text1-text2和 的键之间是否匹配%hash

标签: perlhash

解决方案


一种方法:使用交替键形成模式,并针对它测试字符串

use warnings;
use strict;
use feature 'say';

my @strings = qw(pre-not pre1-pre2-text1-text2 pre3-text3 pre4-pre5-pre6-text4);

my %h = ( 'pre1-pre2' => 1, 'pre3' => 1, 'pre4-pre5-pre6' => 1 );

my $keys_re = join '|', map { quotemeta } keys %h; 

foreach my $str (@strings) { 
    say $str  if $str =~ /$keys_re/;
}

这具有二次复杂性,但交替不会通过所有键,它是 C(正则表达式本身)。

可能的改进(或必要性!)可能是对键进行适当的排序。例如,最短优先

my $keys_re = join '|', map { quotemeta } sort { length $a <=> length $b } keys %h; 

如果存在具有公共部分的键,这可能会有所帮助,但请注意,这可能是一个重要的调整,可能会影响正确性 - 并且可能是需要的;慎重考虑。

要获取密钥本身,请在模式周围添加捕获括号

foreach my $str (@strings) { 
    say "$str matched by key: $1"  if $str =~ /($keys_re)/;
}

其中$1包含匹配并被捕获的交替,这是关键。


推荐阅读