如何避免数组数组中的重复值?

时间:2014-09-04 12:08:28

标签: perl multidimensional-array unique

我知道如何避免一维数组中的重复。

但是,我有一个数组数组,它​​的两行可能包含不同引用的数组,但值相同。我试过这个:

sub unique {
     my %seen;
     grep !$seen{join('',$_)}++, @_ 
}

my @aa = (  ["1","2","3"],["1","2","3"],["1","2","4"] );
my @bb = unique(@aa);
print $_ for (@bb);

它应该删除两个“123”数组中的一个,但事实并非如此。可能是因为$ _包含引用而不是可以连接的数组?当然,我可以遍历$ _ referenced数组并连接所有值,然后将其用作%see hash的键。

但我怀疑在Perl中有一个非常优雅的解决方案,我还不知道......

1 个答案:

答案 0 :(得分:5)

要修复您的天真方法,您应该在两个地方取消引用数组引用:序列化和打印时:

# Assumes the elements don't contain the value of $; (0x1C by default)
sub unique {
     my %seen;
     grep ! $seen{ join $;, @$_ }++, @_
}

my @aa = (  ["1","2","3"],["1","2","3"],["1","2","4"] );
my @bb = unique(@aa);
print "@$_\n" for (@bb);

这仍然会给出错误的输出,想象[ "1\x{1C}2", 3 ]。如果您的数据可能包含此类字符串,则需要更复杂的字符串化。幸运的是,Perl已经有了一种序列化数组引用的方法:Data::Dumper

use Data::Dumper;

sub unique {
    my %seen;
    grep ! $seen{ Dumper $_ }++, @_
}