2012-06-22 40 views

回答

6

是。由於散列鍵是唯一的,所以這是一種慣用的方法。完成同樣事情的方法很多。

你也可以使用一個模塊,如List::MoreUtils

use strict; 
use warnings; 

use List::MoreUtils qw(uniq); 
print join ":", uniq qw(a a a b b c d); 

輸出:

a:b:c:d 

有些不同的方式重複數據刪除:

my @arr = keys { map { $_ => 1 } qw(b a a c d g e f) }; 

大括號創建匿名散列爲keys,map語句創建一個鍵/值對列表。


my @arr = dedupe(qw(a a b c d d e)); 

sub dedupe { 
    my %hash = map { $_ => 1 } @_; 
    return keys %hash; 
} 

同樣的事情,但在子程序的形式,分成兩行。請注意,這兩個列表將以半隨機順序排列,因爲哈希是無序的。

List::MoreUtils使用的子程序同樣簡單,也許是可取的,因爲它將保留參數的順序。不過,它仍然使用散列。

sub uniq { 
    my %seen =(); 
    grep { not $seen{$_}++ } @_; 
} 
+0

謝謝,我只是想,而不是分配1或'undef'到它的值,我們可以給每個鍵的相關數組位置像這樣:'@hash {@arr } =(0 .. $#arr);'然後通過交換'%hash'中的鍵和值,我們可以根據它們的原始順序檢索這些值,我是否正確? – bolbol

+2

是的,你可以做'my @arr = sort {$ hash {$ a} <=> $ hash {$ b}} keys%hash'。但是,上面描述的'uniq'子是最好的,因爲排序只是額外的處理。 – TLP

+0

@TLP ok,但是'HASH-REF'鍵如何在你的例子中工作? – gaussblurinc

1

一個獨特的陣列沒有訂購a.k.a.一套。我知道你說'沒有模塊'(爲什麼?!)。但是如果你改變了主意,試試Set::ObjectSet::Scalar

+0

謝謝,因爲我的意圖是理解概念,而不是解決問題,否則我沒有使用模塊的問題。 – bolbol

相關問題