如何解决查找匹配列表项,其中另一个列表具有匹配字符串
我有一个文本字符串列表和一个RE /匹配字符串+标记的哈希,毫无疑问,我需要将它们匹配。我还需要知道第一个列表中是否有任何项与第二个列表中的一个不匹配,例如:
@strings = qw(red orange yellow blue);
%matches = (
re => "apple",or => "orange",ye => "banana",);
我需要将每个$strings
与一个$hash_value
(例如红色的苹果)进行匹配,并引发“蓝色”的错误。
我可以使用两个嵌套循环来完成此任务,其中@strings
遍历$hash_keys
寻找匹配项并获取哈希值。我认为我需要使用一个标志变量来识别内部$hash_keys
循环是否在不匹配任何内容的情况下结束。
我也许也可以通过遍历$hash_keys
和'grep'ing @strings
来做到这一点,但是我不知道如何发现不匹配的$ strings。
这两个选项似乎都很笨拙,我觉得必须有一种“更清洁”的方式。我缺少明显的东西吗?
编辑
抱歉,我拥有的代码如下:
foreach $string (@strings) {
$match = "false";
foreach $key (keys %matches) {
if ( /$key/ =~ $string) {
&do_my_thing($string,$matches{$key});
$match = "true";
break;
}
}
( $match eq "false" ) && raise_unmatched_error($string);
}
这可以满足我的要求,可以识别与该字符串匹配的掩码(键),还可以标记不匹配的字符串,但是看起来很不雅致。在我看来,应该可以使用map(可能与grep一起使用)来a)将哈希键与字符串匹配,并且b)识别不匹配的字符串。
不过,我可能会考虑过度;它有效,可能可以维护,也许不需要其他任何东西。
解决方法
获取哈希中的所有键,然后将它们转换为正则表达式(使用交替运算符,以便您可以对任何键进行匹配)。然后,您可以对@strings
中的每个字符串进行一次正则表达式匹配。如果将捕获括号放在正则表达式周围,则匹配的字符串将以$1
结尾。并且,如果字符串与正则表达式不匹配(如“蓝色”),则可以显示所需的警告。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my @strings = qw[red orange yellow blue];
my %matches = (
re => 'apple',or => 'orange',ye => 'banana',);
my $match_re = join '|',keys %matches;
say "DEBUG: $match_re";
for (@strings) {
if (/($match_re)/) {
say "$_ -> $matches{$1}";
} else {
say "No match for '$_'";
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。