![]() |
1
33
为了比Python的生成器更灵活的解决方案,我编写了这个模块 List::Gen 在提供随机访问延迟生成器阵列的CPAN上:
因为生成器假装是数组,所以可以无缝地与普通Perl代码混合。还有一种面向对象的方法:
在每种情况下,生成器都是懒惰的,创建时不计算任何内容,然后只计算满足切片所需的值。斐波那契序列的递归定义多次调用自己,因此
还可以使用生成器作为迭代器:
如果有任何问题,请告诉我。 更新: 我发布了一个新版本的模块(0.80),它使得在生成器中使用迭代算法更容易。下面是一个与OP的例子非常相似的例子:
如果你
|
![]() |
2
35
迭代器的概念在Perl中有点不同。您基本上希望在持久变量上返回一个一次性的子例程“closed”。
如果你不喜欢
|
![]() |
3
16
优秀的 Higher-Order Perl 书(在指定的链接上免费提供)包含了许多有关主题的信息,特别是有一整章关于迭代器。通过“高阶”,作者暗示使用Perl的能力作为一种具有一流功能的函数语言来实现各种酷的东西。这真的是一本很好的书——我读了大部分,关于迭代器和流的章节都很棒。如果您打算编写Perl代码,我强烈建议您至少跳过它。 |
![]() |
4
8
有一个类似的方法来生成迭代器/生成器,但它并不像在Python上那样是“第一类公民”。 在Perl中,如果您看不到您想要的内容(在 强制性的 行程 CPAN 第一 !)您可以滚动自己的,类似于基于Perl闭包和匿名子例程的Python迭代器。 考虑:
潜艇
引用自 Perl Bible “在你了解标量和列表上下文之间的区别之前,你会很痛苦的”-p 69(一本强烈推荐的书btw…)
在这种情况下,annon sub只返回一个值。我在Perl中所知道的唯一可以在标量上下文中工作的循环机制是
有办法解决这个问题。实际上,您可以编写类似于
您可以在MarkJasonDominos的优秀著作“高阶Perl”中了解更多关于Perl迭代器的信息。 Chapter 4 is all about Interators 布莱恩·福伊也有一个优秀的 article Perl评论中的交互程序。 |
![]() |
5
6
|
![]() |
6
4
这里是一个与最初提出的问题紧密一致的回答。 任何实现惰性列表的Perl模块(例如,list::gen、memoize等)也允许您提供自己的生成器子例程(我的意思不是“generator”,如python中所示),这将允许您执行本例中所示的操作。在这里,懒惰地生成列表的模块称为alef。
以下是输出: [spl@briareus~]美元/fibo.pl 零 一 一 二 三 五 八 十三 二十一 三十四 五十五 八十九 一百四十四 二百三十三 三百七十七 使用这里使用的懒惰列表模块,在幕后没有什么神奇的事情发生。这就是alef的take子例程的样子。
|
![]() |
7
3
在这种情况下,可以使用memoization。
|
![]() |
8
3
CPAN上有一些迭代器/生成器模块可以在这里提供帮助。下面是直接翻译为
|
|
Julia · 矢量中相加为总和S的值的数量 2 年前 |
![]() |
apetrai · 我应该如何假设算法使用哪种迭代器类别? 2 年前 |
![]() |
Pratik · 不使用Java DeepCopy迭代器 6 年前 |
![]() |
PanDe · 将两个列表合并为一个Dict、Tuple 6 年前 |
![]() |
bisarch · 迭代哈希集并在每次迭代中删除多个元素 6 年前 |