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)
从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)
keys @tokens; # resets iterator
($i, $val) = each @tokens;
say "Now at => $val ($i)"; # Now at => a (0)
Run Code Online (Sandbox Code Playgroud)
没有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这样的东西.我将把这个版本留给读者练习.:-)