所以我需要的是一个简单的方法来判断两个数组在perl中是否相同.顺序无关紧要,所以我正在寻找这样的东西:
我的@a =(1,2,3);
我的@b =(2,3,1);
我的@c =(1,4);
&相同(@ a,@ b)返回1
&相同(@ a,@ c)返回0
谢谢!
解决方法
你可以用散列计算元素的计数.有一个(element => count)哈希值,每次第一个数组有该元素时都会向上计数,而每次有另一个数据时都会向下计数(反之亦然).如果两个数组具有所有相同的元素,则散列中的每个值都将为0.
sub have_same_elements { my ($arr1,$arr2) = @_; my %counts = (); $counts{$_} += 1 foreach (@$arr1); $counts{$_} -= 1 foreach (@$arr2); return !(grep { $_ != 0 } values %counts); } $a_and_b_same = have_same_elements(\@a,\@b); # will be true $a_and_c_same = have_same_elements(\@a,\@c); # will be false
(注意,这可能会或可能不适用于执行自己的字符串化的对象.散列键不能是引用,因此Perl在使用时将引用字符串化.它的默认字符串将引用转换为类似ARRAY(0x12345678)的引用,这使得引用除非它们是相同的东西.但如果一个对象做了自己的字符串化并且不为不同的引用返回不同的字符串,那么这可能会破坏.就这样你知道.)