我是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重复数组
答案 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