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

看板Perl作者 (Cindy Wang)時間9年前 (2014/08/29 02:40), 9年前編輯推噓6(6017)
留言23則, 6人參與, 最新討論串1/2 (看更多)
程式情境類似這樣: @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; } } } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 112.121.80.249 ※ 文章網址: http://www.ptt.cc/bbs/Perl/M.1409251242.A.EDB.html

08/29 03:35, , 1F
$good = P $a[-1] && 5 == grep {P $_} @a;
08/29 03:35, 1F

08/29 03:40, , 2F
$good = P($a[-1]) && 5 == grep {P $_} @a; (樓上少括號)
08/29 03:40, 2F

08/29 03:41, , 3F
or, $good = P($a[-1]) && 4 == grep {P $_} @a[0..$#a-1];
08/29 03:41, 3F

08/29 03:54, , 4F
08/29 03:54, 4F

08/29 03:54, , 5F
general solution (e.g. \$a == \$a[-1])
08/29 03:54, 5F

08/29 06:03, , 6F
最後一個 each 的用法蠻有趣的
08/29 06:03, 6F

08/29 11:51, , 7F
喔喔! 我喜歡 \$a == \$a[-1] 這個!
08/29 11:51, 7F

08/29 11:55, , 8F
一樓的話就是 P 要多跑一次; 3樓的話就只是 0..$#a-1
08/29 11:55, 8F

08/29 11:55, , 9F
形狀醜了點 ^^|
08/29 11:55, 9F
※ 編輯: CindyLinz (112.121.80.249), 08/29/2014 14:01:25

08/29 14:16, , 10F
原來還有取反斜線這招 (筆記)
08/29 14:16, 10F

08/29 16:02, , 11F
取反斜線是什麼意思啊? 其實看不太懂耶...
08/29 16:02, 11F

08/29 16:27, , 12F
A backslash is used to make a reference...
08/29 16:27, 12F

08/29 16:30, , 13F
http://goo.gl/maf5RG click to see detail
08/29 16:30, 13F

09/05 11:42, , 14F
我發現我的問題是 reference 為什麼可以當 left value
09/05 11:42, 14F

09/05 12:33, , 15F
why not it's Perl!
09/05 12:33, 15F

09/05 13:51, , 16F
這邊 reference 沒有被當 left value 啊, == 拿來比較
09/05 13:51, 16F

09/05 13:51, , 17F
而已
09/05 13:51, 17F

09/05 13:51, , 18F
然後 for my $a (...) 的 $a 在 perl 叫 alias 不是ref
09/05 13:51, 18F

09/05 13:52, , 19F
跟 C++ 類比的話像是 C++ 的 reference, C++ 的
09/05 13:52, 19F

09/05 13:52, , 20F
reference 也是可以取 address 的, 也是取到被 ref 的
09/05 13:52, 20F

09/05 13:52, , 21F
對象的 address
09/05 13:52, 21F

09/05 15:03, , 22F
的確是我沒注意到是 == 不是 =
09/05 15:03, 22F

09/05 20:02, , 23F
XD
09/05 20:02, 23F
文章代碼(AID): #1J_tUgxR (Perl)
文章代碼(AID): #1J_tUgxR (Perl)