2013-05-22 51 views
2

我是perl的新手,並且在跳過foreach循環中的數組的下一個元素時沒有重複循環。假設我有以下情況,我正在通過一個使用foreach循環的數組。在perl中獲取foreach循環中的數組的下一個元素,而不使用next /跳轉到循環的下一個迭代中

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 
} 

是否有任何方式這可以用一個陣列被複制。
有沒有辦法做到這一點使用下一個重複陣列

+3

'next'有什麼問題? –

+0

@Cyx如果一個給定的$行觸發了一個if語句,並且在這個if語句中使用的代碼塊需要該數組的下一個元素,那麼next將無法實現期望的結果。 – schulwitz

回答

2

可以使用數組索引。如果你不希望出現這種情況,你可以使用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

我喜歡你在迭代器中使用閉包!好的解決方案:通過將煩人的索引隔離在迭代器中,讓while循環保持整潔。如果您正在解析輸出並且想要間隔地從「列表」中拉出多行,那麼這非常有用。 – fbicknel

+0

我喜歡閉包迭代器解決方案,但它的性能不同於普通的foreach循環,因爲它不幸會失敗,因爲任何數組元素是零,空字符串或未定義。我已經在下面發佈了一個編輯好的解 – schulwitz

-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 
在循環的下一次迭代再次

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

這將然而,過程中的「下一個」行:

+0

'scalar @list-1'與'@list-1'和$ $ list是一樣的(它不是我的downvote) –

+0

@mpapec - 因爲它們是相同的 - 爲什麼評論我使用的是我最喜歡? –

+0

@TheDownVoters - 如果你不給我一個暗示什麼是錯誤的,我該如何修補我的邪惡方式? –

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"; 
    } 
} 
相關問題