作者:
gugod (å•Š)
2018-03-12 07:21:08※ 引述《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 只是印出兩個空的東西而已。
才會看起來好像沒有效果一樣。