我有两个数组哈希。我想比较两个数组散列中的键是否包含相同的值。
#!/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
无效。感谢
答案 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