在perl中的foreach循环中获取数组的下一个元素,而不使用next / skip到下一个循环迭代

时间:2013-05-22 11:51:47

标签: arrays perl foreach next

我是perl的新手,在跳过foreach循环内的数组的下一个元素时遇到了一些问题而没有重复循环。假设我有以下情况,我使用foreach循环遍历数组。

 foreach (@lines){  
     ...  
     print "$_";     #print current line  
     if (cond){      #this condition is met by one "line" in @lines  
        #goto next line;  
        $_=~s/expr/substitute_expr/g;     #substitute in the next line  
      }  
     ...
 }

是否可以在perl中执行此操作。使用文件处理程序,可以使用<>运营商,如下

foreach $line (<FILE>){  
    print "$line\n";        #print this line  
    $line = <FILE>;  
    print "$line";        #print next line  
} 

有没有办法可以用数组复制它 有没有办法做到这一点 没有 使用 下一步 a重复数组

3 个答案:

答案 0 :(得分:3)

您可以使用数组索引:

for my $i (0 .. $#lines) {
    # ...
    print $lines[$i];
    if (cond()) {
        $lines[ $i + 1 ] =~ s/pattern/replace/g;
    }
}

然而,这将在循环的下一次迭代中再次处理“下一行”。如果您不想这样,可以使用C风格:

for (my $i = 0; $i < $#list ; $i++) {
    # ...
}

更高级的技术是定义迭代器:

#!/usr/bin/perl
use warnings;
use strict;


sub iterator {
    my $list = shift;
    my $i = 0;
    return sub {
        return if $i > $#$list;
        return $list->[$i++];
    }
}


my @list = qw/a b c d e f g h/;
my $get_next = iterator(\@list);

while (my $member = $get_next->()) {
    print "$member\n";
    if ('d' eq $member) {
        my $next = $get_next->();
        print uc $next, "\n";
    }
}

答案 1 :(得分:0)

这是对choroba的闭包答案的修改,它将适用于所有数组(即包含0""undef等值的数组,因此表现得更像典型foreach循环。

#!/usr/bin/perl
use warnings;
use strict;

#!/usr/bin/perl
use warnings;
use strict;

sub iterator {
    my $list = shift;
    my $i = 0;
    return sub {
       if (defined $_[0] and $i > $#$list){
           return 0;
       }
       elsif (defined $_[0]){
           return 1;
       }
       else{
           return $list->[$i++];
       }
    }
}

my @list = qw/a b c d e f g h 0 1 2 3/;
my $get_next = iterator(\@list);

while ($get_next->("cycle through all array elements")) {
    my $member = $get_next->();
    print "$member\n";
    if ('d' eq $member) {
        my $next = $get_next->();
        print uc $next, "\n";
    }
}

答案 2 :(得分:-2)

使用计数循环,如:

use strict;
use warnings;

my @list = (1, 2, 3);
# as the item after the last can't be changed,
# the loop stops before the end
for (my $i = 0; $i < (scalar @list - 1); ++$i) {
    if (2 == $list[$i]) {
        $list[$i + 1] = 4;
    }
}

print join ',', @list;

输出:

perl countloop.pl
1,2,4