Слишком много функционального программирования заставляет меня задуматься о zip
.
С Список :: MoreUtils ,
use List::MoreUtils qw(zip);
%hash = qw(a 1 b 2 c 3);
@keys = qw(a b);
@values = @hash{@keys};
%hash = zip @keys, @values;
К сожалению, прототип List :: MoreUtils's zip
ингибирует
zip @keys, @hash{@keys};
Если вы действительно хотите избежать промежуточной переменной, вы можете
zip @keys, @{[@hash{@keys}]};
Или просто напишите свой zip
без проблемного прототипа. (Для этого вообще не нужен List :: MoreUtils.)
sub zip {
my $max = -1;
$max < $#$_and $max = $#$_ for @_;
map { my $ix = $_; map $_->[$ix], @_; } 0..$max;
}
%hash = zip \@keys, [@hash{@keys}];
Если вы собираетесь мутировать на месте,
%hash = qw(a 1 b 2 c 3);
%keep = map +($_ => 1), qw(a b);
$keep{$a} or delete $hash{$a} while ($a, $b) = each %hash;
позволяет избежать дополнительного копирования, которое возникают у решений map
и zip
. (Да, мутирование хеша во время итерации является безопасным ... пока мутация удаляет только самую последнюю итеративную пару.)