我可以从Perl foreach循环中提取下一个元素吗?

Thi*_*ilo 12 perl foreach loops

我可以在Perl中执行以下操作吗?

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

更新:我需要在Perl中使用它,但出于好奇心的缘故:其他语言是否有一个简洁的语法?

Zai*_*aid 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)
Run Code Online (Sandbox Code Playgroud)


dra*_*tun 9

从Perl 5.12开始,通过处理数组,现在每个都更灵活:

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
Run Code Online (Sandbox Code Playgroud)


有一点需要注意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)
Run Code Online (Sandbox Code Playgroud)

所以使用keysvalues手动重置迭代器:

keys @tokens;                      # resets iterator
($i, $val) = each @tokens;
say "Now at => $val ($i)";         # Now at => a (0)
Run Code Online (Sandbox Code Playgroud)


cjm*_*cjm 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

你也可以使用像Array :: Iterator这样的东西.我将把这个版本留给读者练习.:-)