Да. Поскольку хеш-ключи уникальны, это один идиоматический способ сделать это. Количество способов сделать то же самое много.
Вы также можете использовать модуль, например 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
Некоторые различные способы DeDupe:
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{$_}++ } @_;
}
Спасибо, я просто вычислил вместо того, чтобы назначать 1 или 'undef' своим значениям, мы могли бы дать каждому ключу его соответствующую позицию массива следующим образом:' @hash {@arr } = (0 .. $ # arr); 'тогда, заменяя ключи и значения в'% hash', мы можем получить значения в соответствии с их первоначальным порядком, правильно ли? – bolbol
Да, вы могли бы сделать 'my @arr = sort {$ hash {$ a} <=> $ hash {$ b}} ключи% hash'. Однако описанная выше опция 'uniq' является предпочтительной, поскольку сортировка является просто дополнительной обработкой. – TLP
@TLP нормально, но как «клавиши HASH-REF» будут работать в вашем примере? – gaussblurinc