看板 Perl 關於我們 聯絡資訊
※ 引述《cutekid (可愛小孩子)》之銘言: : $A = "a"; : my ($s1,$s2) = do { : if ($A eq "a"){ : ("s1","s2") : } : elsif ($A ne "a"){ : ("s3","s4") : } : }; : 1. 紅色部份才是「字串」比較唷 : 2. 黃色部份應該才是你要的邏輯 : print "S1=$s1 S2=$s2"; : ※ 引述《gecer (gecer)》之銘言: : : $A="a"; : : my ($s1,$s2)=do { : : if ($A=="a") : : {("s1","s2")} : : if ($A!="a") : : {("s3","s4")} : : }; : : print "S1=$s1 S2=$s2"; : : 小弟模仿此用法 但是輸出的s1 s2卻為空 請問這裡do是否沒有執行到? cutekid 建議使用 "eq" 來做字串比對是很好的,特別是,在某一方 算子為常數字串之時。不過 $A=="a" 及 $A!="a" 也還是能被 perl 執行。 perl 會把兩方的算子轉換為數字之後,再做數值比對。也就是說實際上 $A=="a" 等價於 $A==0,而 $A!="a" 等價於 $A!=0。既然仍可以執行, 那 gecer 這個原問題還是可以被討論: > 輸出的s1 s2卻為空 請問這裡do是否沒有執行到? gecer 這裡所猜測的「do是否沒有執行到 」算是一部分正確。 如果在第一個 if BLOCK 中加入 print "hello\n",就可以看見 "hello" 在 螢幕上出現,從而得知它有被執行: if ($A == "a") { print "hello\n"; ("s1", "s2") } gecer 這段程式碼的 do BLOCK 之中,算式共有四項。 但實際上會執行的,為以下三項: 1. $A=="a" 2. ("s1","s2") 3. $A!="a" ("s3", "s4") 這一項,由於 $A!="a" 這式子的值為 false,所以沒有執行到。 cutekid 版本則是以下兩項: 1. $A eq "a" 2. ("s1", "s2") elsif 那邊完全沒有執行到,乃是因為 ($A eq "a") 為 true 的緣故。 也就是說 gecer 版的最終效果跟以下這一小段類似: my ($s1, $s2) = ($A!="a); 最後是 $s1 中放個空字串 (false),而 $s2 仍為 undef。 所以最後的 print 只是印出兩個空的東西而已。 才會看起來好像沒有效果一樣。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 126.94.214.19 ※ 文章網址: https://www.ptt.cc/bbs/Perl/M.1520810472.A.42A.html
cutekid: 推 gugod 大詳解唷,長知識了! 03/12 09:43
gecer: 推~ 03/12 21:55