Re: [问题] Perl do 用法

楼主: 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 只是印出两个空的东西而已。
才会看起来好像没有效果一样。
作者: cutekid (可爱小孩子)   2018-03-12 09:43:00
推 gugod 大详解唷,长知识了!
作者: gecer (gecer)   2018-03-12 21:55:00
推~

Links booklink

Contact Us: admin [ a t ] ucptt.com