2012-06-22 2 views

ответ

6

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

Вы также можете использовать модуль, например 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{$_}++ } @_; 
} 
+0

Спасибо, я просто вычислил вместо того, чтобы назначать 1 или 'undef' своим значениям, мы могли бы дать каждому ключу его соответствующую позицию массива следующим образом:' @hash {@arr } = (0 .. $ # arr); 'тогда, заменяя ключи и значения в'% hash', мы можем получить значения в соответствии с их первоначальным порядком, правильно ли? – bolbol

+2

Да, вы могли бы сделать 'my @arr = sort {$ hash {$ a} <=> $ hash {$ b}} ключи% hash'. Однако описанная выше опция 'uniq' является предпочтительной, поскольку сортировка является просто дополнительной обработкой. – TLP

+0

@TLP нормально, но как «клавиши HASH-REF» будут работать в вашем примере? – gaussblurinc

2

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

см. Perlfaq4: How can I remove duplicate elements from a list or array? для получения более подробной информации.

+0

Спасибо, я люблю perldoc! – bolbol

1

Уникальный массив без заказа комплекта a.k.a. Я знаю, что вы сказали «нет модуля» (почему ?!). Но если вы передумаете, попробуйте Set::Object или Set::Scalar

+0

Спасибо, потому что я намерен понять концепцию и не решить проблему, иначе у меня нет проблем с использованием модулей. – bolbol

Смежные вопросы