Предыдущие ответы в значительной степени суммируют возможные пути выполнения этой задачи.
Тем не менее, я предлагаю модификацию для тех, кто не заботится о подсчитывает дубликаты, но делает заботится о порядке.
my @record = qw( yeah I mean uh right right uh yeah so well right I maybe );
my %record;
print grep !$record{$_} && ++$record{$_}, @record;
Обратите внимание, что ранее предложенный grep !$seen{$_}++ ...
увеличивает $seen{$_}
перед отрицанием, поэтому приращение происходит независимо от того, было ли оно уже %seen
или нет. Выше, однако, короткие замыкания, когда $record{$_}
истинно, оставляя то, что было услышано однажды, «с %record
».
Вы также можете пойти на эту нелепость, которая использует преимущества автовивификации и существования хеш-ключей:
...
grep !(exists $record{$_} || undef $record{$_}), @record;
Это, однако, может привести к некоторой путанице.
И если вас не интересует ни порядок, ни количество дубликатов, вы можете сделать еще один взлом, используя хэш-фрагменты и трюк, о котором я только что упомянул:
...
undef @record{@record};
keys %record; # your record, now probably scrambled but at least deduped