[問題] 用什麼方法知道現在是 foreach 裡的最後一個?

作者: CindyLinz (Cindy Wang)   2014-08-29 02:40:39
程式情境類似這樣:
@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;
}
}
}
作者: scwg ( )   2014-08-29 03:35:00
$good = P $a[-1] && 5 == grep {P $_} @a;$good = P($a[-1]) && 5 == grep {P $_} @a; (樓上少括號)or, $good = P($a[-1]) && 4 == grep {P $_} @a[0..$#a-1];or http://www.perlmonks.org/?node_id=630377 for moregeneral solution (e.g. \$a == \$a[-1])
作者: Neisseria (Neisseria)   2014-08-29 06:03:00
最後一個 each 的用法蠻有趣的
作者: CindyLinz (Cindy Wang)   2014-08-29 11:51:00
喔喔! 我喜歡 \$a == \$a[-1] 這個!一樓的話就是 P 要多跑一次; 3樓的話就只是 0..$#a-1形狀醜了點 ^^|
作者: AntaresStar   2014-08-29 14:16:00
原來還有取反斜線這招 (筆記)
作者: Neisseria (Neisseria)   2014-08-29 16:02:00
取反斜線是什麼意思啊? 其實看不太懂耶...
作者: LiloHuang (十年一刻)   2014-08-29 16:27:00
A backslash is used to make a reference...http://goo.gl/maf5RG click to see detail
作者: Neisseria (Neisseria)   2014-09-05 11:42:00
我發現我的問題是 reference 為什麼可以當 left value
作者: xatier (一切重來就好了...)   2014-09-05 12:33:00
why not it's Perl!
作者: CindyLinz (Cindy Wang)   2014-09-05 13:51:00
這邊 reference 沒有被當 left value 啊, == 拿來比較而已然後 for my $a (...) 的 $a 在 perl 叫 alias 不是ref跟 C++ 類比的話像是 C++ 的 reference, C++ 的reference 也是可以取 address 的, 也是取到被 ref 的對象的 address
作者: Neisseria (Neisseria)   2014-09-05 15:03:00
的確是我沒注意到是 == 不是 =
作者: CindyLinz (Cindy Wang)   2014-09-05 20:02:00
XD

Links booklink

Contact Us: admin [ a t ] ucptt.com