散列映射perl中字符串与键值对的比较



我在Perl中的哈希映射中有键值对。假设所有密钥都是唯一的。

例如:

my %msg_to_number = ( 
 'Hello World, I am XYZ'    => 11,
 'I am using Stack Overflow for Guidance'   => 12,
 'Programming is good!' => 13,
);

现在,如果我想比较的输入字符串是这样的:

str1 = Hello World, I am XYZ;
str2 = Hello World, I am XYZ and ABC;

所以下面的代码正确地将str1映射到散列映射键,但是对于str2,它会失败。

我的问题是如何修改下面的代码,使其适用于这两种情况。也就是说:使代码也适用于str1和str2。对于str1和str2,哈希映射都应该返回11。这甚至是散列映射中的键在比较中匹配字符串的一部分,或者它应该返回匹配的完整字符串。(我假设部分匹配的情况将与句子开头的单词进行比较,这会简化一些事情)

现在下面的代码通过删除像!,#这样的字符来进行比较等等,转换为小写然后匹配。

#!/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_matchE$/i } keys     
%msg_to_number;
print "$first_match   =  $msg_to_number{$first_match}n";

我已经尝试过在上面的代码中使用regex,但无法使其工作。若有人能提出一些改变或不同的方法(建议)做同样的事情将是伟大的。(当前代码正在执行的原始逻辑加上部分比较)。这是关于堆栈溢出的后续问题。

感谢

更新时间:什么应该匹配,什么不应该匹配的示例。

假设以下哈希图:我的%msg_to_number=("你好,世界,我是XYZ"=>11,"我正在使用堆栈溢出进行指导"=>12,"编程很好!"=>13,);

str1 = Hello World, I am XYZ
str2 = Hello World
str3 = Hello World, I am XYZ, ABC and EFG.

所以上面的str1和str2应该匹配而str3不匹配。

正如我所说,即使首发部分是部分匹配,也应该是匹配的。

让我知道这是否清除了用例

我不确定你想做什么,但似乎你需要一个三方匹配。如果使用REGX,则需要确保匹配所有想要的情况,或者不匹配所有不想要的情况。下面的脚本可能更符合您的需要。它匹配(1)您的输入字符串,(2)您的哈希键,以及(3)您似乎在寻找的内容。

   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,
   );
   while(<DATA>)
   {
       chomp;
       foreach my $k (keys %msg_to_number)
       {
           print "$_, $msg_to_number{$k}n" if $_ =~ /Hello World/ and $k =~ /Hello World/;
       }
   }
   exit(0);
   __DATA__
   Hello World
   Hello World, I am ABC
   I am using Stack Overflow for Guidance
   Programming is good
   Hello World, I am ABC, DEF, GHI

这是输出:

Hello World, 11
Hello World, I am ABC, 11
Hello World, I am ABC, DEF, GHI, 11

这可能很简单:

my ( $first_match ) = grep { s/W//gr =~ m/Q$transformed_matchE/i } keys %msg_to_number;

移除模式锚,如果$transformed_match是(转换的)键的子字符串,那么它将匹配。

或者你可以反过来-所以如果是子字符串,它匹配:

#!/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 and ABC!!!!!';
my $transformed_match = $str_to_match =~ s/W//gr;
my ( $first_match ) = grep { my $tr_key = s/W//gr; $transformed_match =~ m/$tr_key/i or $tr_key =~ m/$transformed_match/ } keys %msg_to_number;
print "$first_match   =  $msg_to_number{$first_match}n";

(可能有一种方法可以在正则表达式中进行转换和匹配-我不能100%确定。但这可能不是一个好主意!)

最新更新