我想不管其原来的顺序来创建一个独特的阵列和不使用模块,这是我想出迄今: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