迭代Perl数组的最佳方法

Jea*_*ean 93 arrays iteration perl

迭代Perl数组的哪个是最佳实现(在速度和内存使用方面)?有没有更好的方法?(@Array不需要保留).

实施1

foreach (@Array)
{
      SubRoutine($_);
}
Run Code Online (Sandbox Code Playgroud)

实施2

while($Element=shift(@Array))
{
      SubRoutine($Element);
}
Run Code Online (Sandbox Code Playgroud)

实施3

while(scalar(@Array) !=0)
{
      $Element=shift(@Array);
      SubRoutine($Element);
}
Run Code Online (Sandbox Code Playgroud)

实施4

for my $i (0 .. $#Array)
{
      SubRoutine($Array[$i]);
}
Run Code Online (Sandbox Code Playgroud)

实施5

map { SubRoutine($_) } @Array ;
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 75

  • 在速度方面:#1和#4,但在大多数情况下并不多.

    您可以编写一个基准来确认,但我怀疑您会发现#1和#4稍快一些,因为迭代工作是在C而不是Perl中完成的,并且不会发生任何不必要的数组元素复制.($_混叠到在#1中的元素,但#2和#3上实际复制的标量从阵列).

    #5可能类似.

  • 在内存使用方面:除#5外,它们都是相同的.

    for (@a)是特殊的,以避免扁平化阵列.循环遍历数组的索引.

  • 在可读性方面:#1.

  • 在灵活性方面:#1 /#4和#5.

    #2不支持false的元素.#2和#3具有破坏性.

  • 哇,你用短而简单的句子添加了卡车信息. (3认同)
  • #2 当你进行队列(例如广度优先搜索)时很好:`my @todo = $root; while (@todo) { 我的 $node = shift; ...; 推@todo,...;...; }` (2认同)

Sin*_*nür 24

如果您只关心元素@Array,请使用:

for my $el (@Array) {
# ...
}
Run Code Online (Sandbox Code Playgroud)

要么

如果指数重要,请使用:

for my $i (0 .. $#Array) {
# ...
}
Run Code Online (Sandbox Code Playgroud)

或者,从perl5.12.1开始,您可以使用:

while (my ($i, $el) = each @Array) {
# ...
}
Run Code Online (Sandbox Code Playgroud)

如果你需要循环体中的元素及其索引, 我期待 运用 each 是最快的,但随后你将放弃与5.12.1之前的兼容性perl.

在某些情况下,某些其他模式可能是合适的.