Итерация «Модификатор оператора» над хешем? - PullRequest
0 голосов
/ 09 сентября 2018

Мне хочется использовать формы итераций операторов-модификаторов для хэшей в Perl (v5):

my %h = (...);
do_something($_[0], $_[1]) for each %h;  ### $_[0] => key, $_[1] => val

Или:

my %h = (...);
my @ary = %h;
do_something($_[0], $_[1]) for splice(@ary, 0, 2);

Конечно, ни одна из этих форм не существует. Просто любопытно, была ли работа по поддержке использования splice или each с формой-модификатором оператора for? В Perl 6 или через backport v5?

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

Самое чистое решение заключается в следующем:

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;

Этот последний подход является очень расточительным, поскольку он неэффективно создает множество массивов.

0 голосов
/ 22 ноября 2018

Вы можете сократить

{my ($k, $v);  do_something($k, $v) while ($k, $v) = each(%h); }

до

do_something($a, $b) while ($a, $b) = each %h;

как $ a и $ b уже объявлены для сортировки.

0 голосов
/ 09 сентября 2018

В List :: Util и List :: MoreUtils есть несколько замечательных функций, помогающих в подобных ситуациях. В частности, взгляните на pairs:

use List::Util qw{pairs};

do_something($_->[0], $_->[1]) foreach pairs %h;

Или, если вы можете использовать карту в пустом контексте:

use List::Util qw{pairmap};

pairmap { do_something($a, $b) } %h;
...