程式情境類似這樣:
@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;
}
}
}