0

我有两个数组哈希。我想比较两个数组哈希中的键是否包含相同的值。

#!/usr/bin/perl
use warnings; use strict;
my %h1 = (
      w => ['3','1','2'],
      e => ['6','2','4'],
      r => ['8', '1'],
     );

my %h2 = (
      w => ['1','2','3'],
      e => ['4','2','6'],
      r => ['4','1'],
     );

foreach ( sort {$a <=> $b} (keys %h2) ){
    if (join(",", sort @{$h1{$_}})
        eq join(",", sort @{$h1{$_}})) {    

        print join(",", sort @{$h1{$_}})."\n";
        print join(",", sort @{$h2{$_}})."\n\n";
    } else{
    print "no match\n"
    }
    }


if ("1,8" eq "1,4"){
    print "true\n";
} else{
    print "false\n";
}

输出应该是:

2,4,6
2,4,6

1,2,3
1,2,3

no match
false

但由于某种原因我if-statement的不工作。谢谢

4

3 回答 3

2

智能匹配是一个有趣的解决方案;从 5.010 开始提供:

if ([sort @{$h1{$_}}] ~~ [sort @{$h2{$_}}]) { ... }

当每个数组的对应元素智能匹配自身时,数组引用上的智能匹配返回 true。对于字符串,智能匹配测试字符串是否相等。

这可能比joining 数组的成员更好,因为智能匹配适用于任意数据*。另一方面,智能匹配相当复杂并且有隐藏的陷阱


*关于任意数据:如果你能保证你所有的字符串只包含数字,那么一切都很好。但是,那么您可以只使用数字:

%h1 = (w => [3, 1, 2], ...);
# sort defaults to alphabetic sorting. This is undesirable here
if ([sort {$a <=> $b} @{$h1{$_}}] ~~ [sort {$a <=> $b} @{$h2{$_}}]) { ... }

如果您的数据可能包含任意字符串,尤其是包含逗号的字符串,那么您的比较是不安全的——考虑数组

["1foo,2bar", "3baz"], ["1foo", "2bar,3baz"] # would compare equal per your method
于 2013-03-28T23:24:43.770 回答
1
if (join(",", sort @{$h1{$_}})
    eq join(",", sort @{$h1{$_}})) {  

应该 :

if (join(",", sort @{$h1{$_}})
    eq join(",", sort @{$h2{$_}})) {  

注意$h2. 您正在将一个哈希与其自身进行比较。

于 2013-03-28T23:18:35.090 回答
0

试试这个:它精确地逐行比较两个哈希值。

if (  join(",", sort @{ $h1{$_}})
      eq join(",", sort @{ $h2{$_}}) ) #Compares two lines exactly   
于 2013-03-28T23:19:06.577 回答