4

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

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

3 回答 3

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{$_}++ } @_;
}
于 2012-06-22T06:02:43.187 回答
2

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

请参阅 perlfaq4:如何从列表或数组中删除重复元素?更多细节。

于 2012-06-22T06:18:46.250 回答
1

没有排序的唯一数组,也称为集合。我知道你说“没有模块”(为什么?!)。但是,如果您改变主意,请尝试Set::ObjectSet::Scalar

于 2012-06-22T06:45:15.767 回答