如何跳转迭代器以指向foreach循环中列表的任何其他元素?

时间:2012-11-27 12:34:03

标签: perl

我有一个类似

foreach循环
foreach my $ref_array (@$array1)

其中$array是读取整个Excel工作表的结果。

在我的循环中$ref_array获取工作表中每一行的值。现在我想提前$ref_array,使其获得电子表格下一行的值。我怎么能在循环中间做到这一点?

3 个答案:

答案 0 :(得分:7)

0循环到最后一个数组索引$#$array1将允许您轻松访问下一行/元素:

for my $index ( 0 .. $#$array1 ) {
    my ( $current, $next ) = @$array1[ $index, $index + 1 ];
    # Process the rows
}

答案 1 :(得分:6)

Perl 5.12.0+替代方案:

for ( my ( $idx, $row ) = each @$array1 ) {

    last if $idx == $#array1;         # Skip last iteration

    my $next_row = $array1->[$idx+1];
    # ...
}

答案 2 :(得分:5)

两个想法:

首先,如果你总是需要一对连续的行,那么你就能记住上一行,例如

my $prev_row;
foreach my $row (@rows) {
  # Skip first row; we don't have a previous one yet
  if (!$prev_row) {
    $prev_row = $row;
    next;
  }

  # Do stuff with $prev_row and $row

  $prev_row = $row;
}

其次,使用普通的C风格for循环。在这种情况下,您有索引,并且实际上可以实际访问任何所需的元素:

# don't iterate over the last line so not to access beyond the array
for (my $idx = 0; $idx < (scalar(@rows) - 1); $idx++) {
  my $row      = $rows[$idx];
  my $next_row = $rows[$idx + 1];
}

仅仅通过使用当前元素,您无法使用“简单”foreach。它不是一个交互者,它是对该列表中当前元素的引用。