我正在尝试创建一个独特的数组,而不管其原始顺序如何并且不使用任何模块,这就是我到目前为止所提出的:
my @arr = qw(b a a c d g e f);
my %hash;
@hash{@arr}=();
say keys %hash;
我正在尝试创建一个独特的数组,而不管其原始顺序如何并且不使用任何模块,这就是我到目前为止所提出的:
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:如何从列表或数组中删除重复元素?更多细节。
没有排序的唯一数组,也称为集合。我知道你说“没有模块”(为什么?!)。但是,如果您改变主意,请尝试Set::Object
或Set::Scalar