2007年5月24日星期四

[Tips]perl去除数组中重复元素

author: 云舒
http://www.ph4nt0m.org


写一个小程序时候,需要去除一个数组中的重复元素,搜索了一下,找到的代码主要是两种,一种是使用grep函数,一种是转换为hash表,代码分别如下:

使用grep函数代码片段:

my @array = ( 'a', 'b', 'c', 'a', 'd', 1, 2, 5, 1, 5 );
my %count;
my @uniq_times = grep { ++$count < 2; } @array



使用转换hash代码片段:

my @array = ( 'a', 'b', 'c', 'a', 'd', 1, 2, 5, 1, 5 );
my %saw;
@saw = ( );
my @uniq_array = sort keys %saw



使用grep那种方法并不是很好懂,我尝试解释一下,未必说得清楚或者正确。其实就是把数组的每个元素作为一个hash表的key,++之后第一个元素出现的时候值就是1,如果第二次出现这个值就是2了。其实就是统计了数组每个元素的出现次数,少于2次的就放到新的数组当中。我写了个比较好懂的代码,和使用grep方法的代码原理大致相同,但是又不完全一样,代码如下:

my @array = ( 'a', 'b', 'c', 'a', 'd', 1, 2, 5, 1, 5 );
my %count_hash;
my @uniq_array;
foreach my $value ( @array )
{
        
ifexists$count_hash ) )
        {
                
next;
        }
        
else
        {
                
$count_hash = 1;
                
push@uniq_array, $value );
        }



我写的这个稍微长一点,效率如何没有测试,因为我只是小规模的应用,不涉及到这些。不过友好成都应该好一些吧,比较容易看。同样是把数组的元素作为 hash的key,如果是首次出现就push到新数组中。所有代码都是在RadHat AS3 + Perl 5.8.0环境下测试的。