怎么得到的唯一要素Perl列表

任务。 在程序中编程语言Perl有一个列表。 列表 串的数字。 你需要得到独特的价值,从这个名单。

解决方案使用的功能 uniq 从图书馆 List::Util

最简单和最便捷的方式解决这个问题是使用 功能 uniq 从图书馆 List::Util. 这里是一个例子码:

▶ Run
#!/usr/bin/perl

use List::Util qw(uniq);
use Data::Dumper;

my @arr = uniq('one', 'one', 'b', 'one', 'b', 4);

print Dumper \@arr;

如果你拯救了这个文本的文件 script.pl,然后执行在控制台 perl script.pl, 它会出现在屏幕上:

$VAR1 = [
          'one',
          'b',
          4
        ];

功能 uniq 保留了单的元素,它能够正常工作如果列表 undef.

这个代码将工作从Perl5.26. 在早期版本中包含Perl 该版本的图书馆 List::Util ,其中有没有功能 uniq. 因此,为了 使用这个解决方案需要更新Perl或更新的版本 库 List::Util.

官方文件

这一段的出 perldoc List::Util 有关的功能 uniq:

  uniq
        my @subset = uniq @values

    *Since version 1.45.*

    Filters a list of values to remove subsequent duplicates, as judged by a
    DWIM-ish string equality or "undef" test. Preserves the order of unique
    elements, and retains the first value of any duplicate set.

        my $count = uniq @values

    In scalar context, returns the number of elements that would have been
    returned as a list.

    The "undef" value is treated by this function as distinct from the empty
    string, and no warning will be produced. It is left as-is in the
    returned list. Subsequent "undef" values are still considered identical
    to the first, and will be removed.

自己决定

只是不足以编写一个简化版本的功能 uniq 从图书馆 List::Util:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

sub uniq {
     my (@values) = @_;

     my %h = map {$_ => 1} @values;

     return keys %h;
}

my @arr = uniq('one', 'one', 'b', 'one', 'b', 4);

print Dumper \@arr;

这个代码立即适用于任何版本的Perl。 这里有三条线从潜艇 uniq:

  • my (@values) = @_; —把参数是通过向低音变 @values
  • my %h = map {$_ => 1} @values; —每个元素的 @values 已经创建了一个列表中的两个要素,原件和单元,并将所得到的清单一起放入一个列表,并将该名单向散列。 哈是一个无序设置的关键价值。 一个关键可能是唯一值。 由于这种财产的散列删除了所有重复。
  • return keys %h; —返回的列表中包括唯一的钥匙

但相比的功能 uniq 从图书馆 List::Util 这种代码已不足之处:

  • 我们的功能 uniq 返回的要素在任意的顺序。 不同行同样的代码,导致不同的结果(值返回的一个功能 uniq 将是相同的,但订单中,他们的位置将是不同的)
  • 我们的功能不正常工作如果列表 undef. 我们使用的所有数值从名单,因为哈希键。 和 undef 不可能是一个关键在hash. 当你尝试使用 undef 作为一个关键,并将使用一个空串而不是 undef.

其他文章