在Perl中将迭代器扩展到列表中最优雅的方法是什么?

Mit*_*ldu 6 perl

我有一个带有这个接口的迭代器:$ hit-> next_hsp

目前实现的目标是:

my @list;
while ( my $hsp = $hit->next_hsp ) {
    push( @list, $hsp );
}
Run Code Online (Sandbox Code Playgroud)

现在我认为可能有更好的方法在更少的代码中执行此操作.你怎么说,堆垛机?

dax*_*xim 5

我见过的所有迭代器都undef表示它们已经筋疲力尽了.所以你应该写while (defined(my $hsp = $hit->next_hsp)).以下示例演示了问题中的错误,该错误测试真实(中止为1)而不是定义(通过'升空').

use 5.010;
my $hit = __PACKAGE__;

sub next_hsp {
    state $i;
    $i++;
    return ['mumble', 4, 3, 2, 1, 0, 'liftoff']->[$i];
}

# insert snippet from question here
Run Code Online (Sandbox Code Playgroud)

  • 一个常见的模式是迭代器简单地"返回"而最后没有args.在标量上下文中变为`undef`但如果你说`my($ hsp)= $ hit-> next_hsp`那么迭代器可以安全地返回undef值(或其他任何可能被解释为false的值)这样做有意义.这是有效的,因为包含1个值的列表将是布尔值true,无论该值是false还是undef. (2认同)
  • 所有迭代器?我见过很多无限的数字.:) (2认同)

Ped*_*lva 3

这完全取决于迭代器的实现。如果next_hsp是唯一可用的方法,那么您就做对了。