Существует аналогичный метод для создания Iterator / Generator, но он не является "гражданином первого класса", как на Python.
В Perl, если вы не видите, что хотите (после ОБЯЗАТЕЛЬНО поездка в CPAN FIRST !), вы можете свернуть свой собственный, который похож на итератор Python, основанный на замыканиях Perl и анонимной подпрограмме.
Рассмотрим:
use strict; use warnings;
sub fibo {
my ($an, $bn)=(1,0);
my $mag=(shift || 1);
my $limit=10**$mag;
my $i=0;
return sub {
($an, $bn)=($bn, $an+$bn);
return undef if ($an >=$limit || wantarray );
return $an;
}
}
my $num;
my $iter=fibo(15);
while (defined($num=$iter->()) ) { printf "%17d\n", $num; }
Подпрограмма fibo
поддерживает закрытие Perl , которое позволяет поддерживать постоянные переменные.Вы можете сделать то же самое, имея модуль, похожий на C / C ++.Внутри fibo
анонимная подпрограмма выполняет работу по возврату следующего элемента данных.
Цитата из Библии Perl"Вы будете несчастны, пока не узнаете разницу между скалярным и списочным контекстом" - стр. 69 (настоятельно рекомендуется книга между прочим ...)
В этом случае сабвуфер annon возвращает только одно значение.Единственный известный мне в Perl механизм зацикливания, который может работать в скалярном контексте, это while
;Другие пытаются заполнить список, прежде чем продолжить, я думаю.Поэтому, если вы вызвали подпункт anon в контексте списка, он должным образом вернет следующее число Фибоначчи, в отличие от Python для итераторов, и цикл завершится.Вот почему я поставил return undef if .... wantarray
, потому что он не работает в контексте списка, как написано.
Есть способы исправить это.В самом деле, вы можете написать подпрограммы, которые действуют как map
foreach
и т. Д., Но это не так просто, как выход Python.Вам понадобится дополнительная функция для использования внутри цикла foreach.Компромисс в том, что подход Perl обладает огромной мощью и гибкостью.
Подробнее об итераторах Perl вы можете прочитать в превосходной книге Марка Джейсона Доминуса "Perl высшего порядка" Глава 4 посвящена интеграторам Брайан Д. Фой также имеет отличную статью об Интеграторах в Perl Review.