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