Самое чистое решение заключается в следующем:
do_something($_, $h{$_}) for keys %h;
Если вы хотите сэкономить память, вы можете использовать each
как обычно.
{ my ($k, $v); do_something($k, $v) while ($k, $v) = each(%h); }
Конечно, это намного чищебез использования модификатора оператора.
while (my ($k, $v) = each(%h)) { do_something($k, $v); }
Наконец, если вы на самом деле не имеете дело с хешем, можете использовать pairs
из List :: Util .
use List::Util qw( pairs );
do_something(@$_) for pairs %h;
Этот последний подход является очень расточительным, поскольку он неэффективно создает множество массивов.