程式情境类似这样:
@a 是某个外来阵列
my $counter = 0; # 记录 @a 里面有几个符合条件的
my $good = 0; # 最后的结果
for my $a (@a) {
if( $a 满足某条件 ) {
++$counter;
if( $counter==5 && $a 是 @a 的最后一项 ) {
$good = 1;
}
}
}
想问大家有没有什么有趣的写法? ^^
我试了几个, 不过感觉好像都有可挑的地方..
# 我觉得额外弄一个语法上看起来跟循环没关联的循环计数器很不开心 ><
my $i = 0;
for my $a (@a) {
++$i;
if( $a 满足某条件 ) {
++$counter;
if( $counter==5 && $i==$#a ) {
$good = 1;
}
}
}
# 我觉得里面要写成 $a[$i] 很不开心 ><
for my $i (0..$#a) {
if( $a[$i] 满足某条件 ) {
++$counter;
if( $counter==5 && $i==$#a ) {
$good = 1;
}
}
}
# 我觉得要复制 $a = $a[$i] 很不开心 ><
for my $i (0..$#a) {
my $a = $a[$i];
if( $a 满足某条件 ) {
++$counter;
if( $counter==5 && $i==$#a ) {
$good = 1;
}
}
}
# 我觉得 满足某条件 要跑两次很不开心 ><
for my $a (@a) {
if( $a 满足某条件 ) {
++$counter;
}
}
if( $counter==5 && $a[-1] 满足某条件 ) {
$good = 1;
}
# 我觉得 perl 5.12 才能用很不开心 ><
# 而且 while 里面最好不要有 last, 不然有一天会后悔..
# 不过这是这几个里面我自己觉得看起来最顺眼的一个 @@"
while( my($i, $a) = each @a ) {
if( $a 满足某条件 ) {
++$counter;
if( $counter==5 && $i==$#a ) {
$good = 1;
}
}
}
# 整理一下 scwg 的推文放上来正文 :p
$good = $a[-1] 满足某条件 && 5 == grep {$_ 满足某条件} @a;
$good = $a[-1] 满足某条件 && 4 == grep {$_ 满足某条件} @a[0..$#a-1];
for my $a (@a) {
if( $a 满足某条件 ) {
++$counter;
if( $counter==5 && \$a==\$a[-1] ) {
$good = 1;
}
}
}