比较两个数组散列之间的值

时间:2013-03-28 23:11:58

标签: arrays perl hash

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

#!/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无效。感谢

3 个答案:

答案 0 :(得分:2)

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

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

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

这可能比join数组成员更好,因为智能匹配适用于任意数据*。另一方面,智能匹配非常复杂且具有hidden gotchas


关于任意数据的

*:如果你可以保证你的所有字符串只包含数字,那么一切都很好。但是,你可以使用数字代替:

%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

答案 1 :(得分:1)

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

应该是:

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

请注意$h2。你将一个哈希与自己进行比较。

答案 2 :(得分:0)

试试这个:它会逐行比较两个哈希值。

if (  join(",", sort @{ $h1{$_}})
      eq join(",", sort @{ $h2{$_}}) ) #Compares two lines exactly