这是您可以做到的一种方法:
#!/usr/bin/env perl
use strict;
use warnings;
my %msg_to_number = (
'Hello World, I am XYZ' => 11,
'I am using Stack Overflow for Guidance' => 12,
'Programming is good!' => 13,
);
my $str_to_match = 'Hello World, I am XYZ!';
#note - grep returns a list. We chuck any duplicate hits away.
my ( $first_match ) = grep { $str_to_match =~ m/\Q$_\E/ } keys %msg_to_number;
print "$first_match = $msg_to_number{$first_match}\n";
注意 - grep 中的模式匹配是相反的。您检查字符串是否与哈希中的键匹配,如果匹配则返回。仅当您的密钥是主字符串的子字符串(或完全匹配)时,它才有效。
而且它只获得“第一个”匹配,因此实际上来说 - 如果存在重复项,结果将是随机的。因此,请确保您的哈希键足够唯一。
E.g:
my $str_to_match = 'Hello World, I am XYZ!Programming is good!!!!!one';
my ( $first_match ) = grep { $str_to_match =~ m/\Q$_\E/ } keys %msg_to_number;
print "$first_match = $msg_to_number{$first_match}\n";
会随机给你:
Programming is good! = 13
Hello World, I am XYZ = 11
作为替代方案 - 一种可能性是对输入/输出执行通用转换,这使得它对差异“视而不见”。
E.g.
#!/usr/bin/env perl
use strict;
use warnings;
my %msg_to_number = (
'Hello World, I am XYZ' => 11,
'I am using Stack Overflow for Guidance' => 12,
'Programming is good!' => 13,
);
my $str_to_match = 'Hello World, I am XYZ!!!!!';
my $transformed_match = $str_to_match =~ s/\W//gr;
my ( $first_match ) = grep { s/\W//gr =~ m/^\Q$transformed_match\E$/i } keys %msg_to_number;
print "$first_match = $msg_to_number{$first_match}\n";
这条\W
这是“非单词”字符(如标点符号和空格),并像这样比较两者。这意味着你的匹配有点模糊,并且允许任意感叹号、空格等。
如果你想处理默认情况,那么就非常方便了。//
运算符就是你想要的。
return $msg_to_number{$first_match} // "default value here " ;
(或者你可以只测试定义$first_match
)
对于不区分大小写的匹配,i
正则表达式的修饰符将起到第二个示例中的作用。