Arrays 在perl中,在foreach循环中获取数组的下一个元素,而无需使用循环的下一次/跳到下一次迭代

Arrays 在perl中,在foreach循环中获取数组的下一个元素,而无需使用循环的下一次/跳到下一次迭代,arrays,perl,foreach,next,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;

我是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  
} 
foreach$line(){
打印“$line\n”#打印此行
$line=;
打印“$line”#打印下一行
} 
是否有任何方法可以通过阵列进行复制。

是否有任何方法可以在不使用下一个或重复数组的情况下执行此操作,如中所示使用计数循环:

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;

您可以使用数组索引:

for my $i (0 .. $#lines) {
    # ...
    print $lines[$i];
    if (cond()) {
        $lines[ $i + 1 ] =~ s/pattern/replace/g;
    }
}
然而,这将在循环的下一次迭代中再次处理“next”行。如果不希望这样,可以将C样式用于:

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

这是对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";
    }
}

next
有什么问题?@Cyx如果给定的$行触发
If
语句,并且此
语句中使用的代码块需要数组的下一个元素,则
next
无法达到所需的目的。
scalar@list-1
@list-1
$\list
(这不是我的反对票)@mpapec-因为它们是一样的-为什么要评论我使用我最喜欢的一个?@投票人-如果你不给我一个错误的提示,我怎么能改正我的邪恶方式?你的
for
循环从不在最后一个元素上迭代。如果是这样的话,你应该在那一行旁边放一条评论。我喜欢你在迭代器中使用闭包!很好解决方案:通过在迭代器中隔离恼人的索引来保持while循环整洁清晰。如果您正在解析输出并想从“列表”中提取几行,这一点尤其有用我喜欢闭包迭代器解决方案,但它的性能不同于普通的foreach循环,因为对于任何为零、空字符串或未定义的数组元素,它都将不幸失败。我在下面发布了一个经过编辑的解决方案。
#!/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";
    }
}
#!/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";
    }
}