作者gugod (啊)
看板Perl
标题Re: [问题] Perl do 用法
时间Mon Mar 12 07:21:08 2018
※ 引述《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://webptt.com/cn.aspx?n=bbs/Perl/M.1520810472.A.42A.html
1F:推 cutekid: 推 gugod 大详解唷,长知识了! 03/12 09:43
2F:推 gecer: 推~ 03/12 21:55