我想不管其原來的順序來創建一個獨特的陣列和不使用模塊,這是我想出迄今:Perl:這是創建獨特陣列的正確方法嗎?
my @arr = qw(b a a c d g e f);
my %hash;
@hash{@arr}=();
say keys %hash;
我想不管其原來的順序來創建一個獨特的陣列和不使用模塊,這是我想出迄今:Perl:這是創建獨特陣列的正確方法嗎?
my @arr = qw(b a a c d g e f);
my %hash;
@hash{@arr}=();
say keys %hash;
是。由於散列鍵是唯一的,所以這是一種慣用的方法。完成同樣事情的方法很多。
你也可以使用一個模塊,如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{$_}++ } @_;
}
是的,你正在使用正確的方式,但也有很多其他的方式來創建一個獨特的數組。
有關更多詳細信息,請參閱perlfaq4:How can I remove duplicate elements from a list or array?。
謝謝,我愛perldoc! – bolbol
一個獨特的陣列沒有訂購a.k.a.一套。我知道你說'沒有模塊'(爲什麼?!)。但是如果你改變了主意,試試Set::Object
或Set::Scalar
謝謝,因爲我的意圖是理解概念,而不是解決問題,否則我沒有使用模塊的問題。 – bolbol
謝謝,我只是想,而不是分配1或'undef'到它的值,我們可以給每個鍵的相關數組位置像這樣:'@hash {@arr } =(0 .. $#arr);'然後通過交換'%hash'中的鍵和值,我們可以根據它們的原始順序檢索這些值,我是否正確? – bolbol
是的,你可以做'my @arr = sort {$ hash {$ a} <=> $ hash {$ b}} keys%hash'。但是,上面描述的'uniq'子是最好的,因爲排序只是額外的處理。 – TLP
@TLP ok,但是'HASH-REF'鍵如何在你的例子中工作? – gaussblurinc