我知道如何避免一维数组中的重复。
但是,我有一个数组数组,它的两行可能包含不同引用的数组,但值相同。我试过这个:
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中有一个非常优雅的解决方案,我还不知道......
答案 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 $_ }++, @_
}