Как насчет этого (по общему признанию разрушительного для `% h):
delete @h{ @a }; # delete all keys of h already in @a
push @a, keys %h; # push remaining keys onto @a
Таким образом, @a сохраняет свой порядок и просто добавляет неповторяющиеся ключи в %h
.
Несколько слов о разрушительности. Приведенный выше пример иллюстрирует некоторые концепции того, что можно сделать, когда вы можете позволить себе быть разрушительным. И удаление, безусловно, не более разрушительно, чем выход за рамки лексической переменной.
Проблема может быть решена путем простого копирования ее в другой хеш, прежде чем сузить хеш до тех ключей, которые не найдены в @a
.
my %h2 = %h;
delete @h2{ @a };
push @a, keys %h2;