perl - 检查字符串的一部分是否存在于哈希表的键中
问题描述
我正在处理 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
?
解决方案
一种方法:使用交替键形成模式,并针对它测试字符串
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
包含匹配并被捕获的交替,这是关键。
推荐阅读
- python - 套接字没有与服务器建立连接
- c# - 检查网络共享目录是否正在使用
- python - '包含' numpy 库?
- javascript - 在 PHP 中的时间范围内执行操作
- java - 如何通过 Api Gateway 自动生成的 Java SDK 使用 cognito 持久性未经身份验证的凭据?
- azure - 微软翻译语音缺少标点符号
- node.js - 为什么我的代理句不能正常工作?
- javascript - 引导模式联系表单提交不起作用
- python - 制作 Django Rest Framework (DRF) 工作流的方法
- vue.js - 在 Vue 路由解析之前访问 Vuex