Perl: это правильный способ создания уникального массива?

Я пытаюсь создать уникальный массив независимо от его исходного порядка и без использования модуля, вот что я придумал до сих пор:

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

3 ответа

Решение

Да. Поскольку хеш-ключи уникальны, это один идиоматический способ сделать это. Количество способов сделать то же самое много.

Вы также можете использовать модуль, например 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

Другие вопросы по тегам