LINUX.ORG.RU

Какой у Perl аналог питоновского iter(callable, sentinel)?

 ,


0

1

Неожиданно для себя оказался посреди перловского болота. Взываю к коллективному разуму ибо сам я слаб в гугл-фу.

Есть итератор, который предполагается использовать так:

while (my $item = $iter->()) {...}

Хочется собрать все значения из него в массив и передать его map (ну или напрямую как-нибудь хитро вызвать map чтобы оно само подергало итератор). Сейчас я делаю так:

my @arr
while (my $item = $iter->()) push @arr, $item

map sub {} @arr;

Но может быть можно короче/красивее это записать?

Сходу решение не скажу, но может тут найдёшь что-то для себя полезное.

DELIRIUM ☆☆☆☆☆
()

Зачем хранить в памяти временные данные, если можно запихнуть содержимое map-блока в while-блок?

AITap ★★★★★
()

Куда короче-то и зачем? А красота в перле наверняка не такая, как в питоне.

Virtuos86 ★★★★★
()

Плюсую вариант от AITap

my @result;
while (my $item = $iter->()) {
	push @result, # ... $item magic ...
}

joy4eg ★★★★★
()

а зачем менять

while (my $item = $iter->()) {...}
на
my @arr
while (my $item = $iter->()) { push @arr, $item };
map {...} @arr;
?

p.s. еще вариант:

for (;$_=$iter->();) {...}
:)

bananym
()
Ответ на: комментарий от bananym

впрочем можно заинлайнить:

map { ... } map { my @a; while(my $i = $_->()) { push @a, $i }; @a } $iter;

bananym
()

Чтобы спрятать лишнюю сущность (@arr) в лексической области блока do {}:

map { ... } do {
    my @arr;
    while (my $item = $iter->()) { push @arr, $item; }
    @arr;
};

Хотя правильный совет уже дали, можно логику из «map BLOCK LIST» перенести в while.

outtaspace ★★★
()
Ответ на: комментарий от AITap

И правда. Не пишу с нуля, я правлю кусок что уже был и за тремя соснами леса не увидел.

redbaron ★★
() автор топика

Лучший вариант это my @items = $obj->items(). Плюсы: быстрее, надежнее, короткость — сестра таланта. Если есть возможность и желание, почему не пойти Ъ-путем? Разыменовывание анонимной функции, невозможность проверки на исключение, невозможность лаконично проверять результат функции это все минусы текущего решения.

ИМХО.

gh0stwizard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.