Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Perl:这是创建唯一数组的正确方法吗?_Arrays_Perl_Perl Data Structures_Perl Hash - Fatal编程技术网

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

Arrays Perl:这是创建唯一数组的正确方法吗?,arrays,perl,perl-data-structures,perl-hash,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; 对。因为散列键是唯一的,所以这是一种惯用的方法。完成同一件事的方法很多 您还可以使用模块,例如 输出: a:b:c:d 有几种不同的重复数据消除方法: my @arr = keys { map { $_ => 1 } qw(b a a c d g

我正在尝试创建一个独特的数组,而不考虑其原始顺序,并且不使用任何模块,这就是我迄今为止所想到的:

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

对。因为散列键是唯一的,所以这是一种惯用的方法。完成同一件事的方法很多

您还可以使用模块,例如

输出:

a:b:c:d
有几种不同的重复数据消除方法:

my @arr = keys { map { $_ => 1 } qw(b a a c d g e f) };
花括号为
键创建匿名哈希,map语句创建键/值对列表


同样的事情,但在子程序的形式,并分为两行。请注意,由于散列是无序的,所以这两个列表将以半随机顺序排列

List::MoreUtils
使用的子例程同样简单,而且可能更可取,因为它将保留参数的顺序。不过,它仍然使用散列

sub uniq {
    my %seen = ();
    grep { not $seen{$_}++ } @_;
}

是的,您使用的方法是正确的,但是还有许多其他方法可以创建唯一的阵列


有关更多详细信息,请参见perlfaq4:一个没有订购A.k.A.集合的唯一数组。我知道你说“没有模块”(为什么?!)。但如果您改变主意,请尝试或

谢谢,我只是想,我们可以给每个键指定其关联的数组位置,而不是为其值指定1或
unde
,如下所示:
@hash{@arr}=(0..$\arr)
然后通过交换
%hash
中的键和值,我们可以根据其原始顺序检索值,对吗?是的,您可以执行
my@arr=sort{$hash{$a}$hash{$b}}键%hash
。但是,上面描述的
uniq
子函数更可取,因为排序只是额外的处理。@loldop您可以将hash ref与
keys
函数一起使用。不确定需要哪个perl版本。@TLP,我的旧perl 5.12.4无法做到:\Thank,因为我的目的是理解概念而不是解决问题,否则我在使用模块方面没有问题。
my @arr = dedupe(qw(a a b c d d e));

sub dedupe {
    my %hash = map { $_ => 1 } @_;
    return keys %hash;
}
sub uniq {
    my %seen = ();
    grep { not $seen{$_}++ } @_;
}