Perl:这是创建唯一数组的正确方法吗?

时间:2012-06-22 05:49:53

标签: arrays perl perl-data-structures perl-hash

我正在尝试创建一个独特的数组,无论其原始顺序如何,并且不使用任何模块,这是我到目前为止所提出的:

my @arr = qw(b a a c d g e f);
my %hash;
@hash{@arr}=();
say keys %hash;

3 个答案:

答案 0 :(得分: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{$_}++ } @_;
}

答案 1 :(得分:2)

是的,您使用的方法正确,但还有很多其他方法可以创建一个独特的数组。

有关详细信息,请参阅perlfaq4:How can I remove duplicate elements from a list or array?

答案 2 :(得分:1)

一个独特的数组,没有订购a.k.a.一套。我知道你说'没有模块'(为什么?!)。但如果您改变主意,请尝试Set::ObjectSet::Scalar