寫一個小程序時候,需要去除一個數組中的重復元素,搜索了一下,找到的代碼主要是兩種,一種是使用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{ @array } = ( ); 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 ) { if( exists( $count_hash{ $value } ) ) { next; } else { $count_hash{ $value } = 1; push( @uniq_array, $value ); } } |
#!/usr/bin/perl use strict; my %hash; my @array = (1..10,5,20,2,3,4,5,5); #grep 保存符合條件的元素 @array = grep { ++$hash{$_} < 2 } @array; print join(" ",@array); print "n";
