2010-06-05 108 views
12

我可以在Perl中做如下的事情嗎?我可以從Perl foreach循環中獲取下一個元素嗎?

foreach (@tokens) { 
    if (/foo/){ 
     # simple case, I can act on the current token alone 
     # do something 
     next; 
    } 
    if (/bar/) { 
     # now I need the next token, too 
     # I want to read/consume it, advancing the iterator, so that 
     # the next loop iteration will not also see it 
     my $nextToken = ..... 
     # do something 
     next; 
    } 

} 

更新:我需要這在Perl,但爲了好奇:難道其他語言有一個整潔的語法?

回答

19

必須使用for循環嗎?複製原始和 '消費' 它shift

use strict; 
use warnings; 

my @original = 'a' .. 'z'; # Original 
my @array = @original;  # Copy 

while (my $token = shift @array) { 

    shift @array if $token =~ /[nr]/; # consumes the next element 
    print $token; 
} 

# prints 'abcdefghijklmnpqrtuvwxyz' ('s' and 'o' are missing) 
+0

不錯。就我而言,銷燬原件甚至不是問題,所以我可以在沒有副本的情況下完成。 – Thilo 2010-06-05 14:29:45

8

不與foreach循環。您可以使用C風格for循環:

for (my $i = 0; $i <= $#tokens; ++$i) { 
    local $_ = $tokens[$i]; 
    if (/foo/){ 
    next; 
    } 
    if (/bar/) { 
    my $nextToken = $tokens[++$i]; 
    # do something 
    next; 
    } 
} 

您也可以使用類似Array::Iterator。我會把這個版本作爲讀者的練習。 :-)

9

也通過努力陣列使用Perl 5.12,each is now more flexible開始:

use 5.012; 
use warnings; 

my @tokens = 'a' .. 'z'; 

while (my ($i, $val) = each @tokens) { 
    if ($val =~ m/[aeiou]/) { 
     ($i, $val) = each @tokens; # get next token after a vowel 
     print $val; 
    } 
} 

# => bfjpv 


一個與each警告,記得迭代器是全球性的,如果你打破循環,則不會重置。

對於例如:

while (my ($i, $val) = each @tokens) { 
    print $val; 
    last if $i == 12; 
} 

# => abcdefghijklm 

my ($i, $val) = each @tokens; 
say "Now at => $val ($i)";   # Now at => n (13) 

因此,使用keysvalues手動重置迭代:

keys @tokens;      # resets iterator 
($i, $val) = each @tokens; 
say "Now at => $val ($i)";   # Now at => a (0) 
+0

哇!我不知道 - 這會派上用場。謝謝 :) – zdim 2016-12-06 22:33:15

0

我喜歡Zaids的答案,但如果遇到陣列 所以在一個NUL元件失敗...

while (@array) { 

    my $token = shift @array; 
    shift @array if $token =~ /[nr]/; # consumes the next element 
    print $token; 
} 

這不會sto p直到@array爲空。

相關問題