一、控制的分类
1.1)顺序、条件、循环
1.2)布尔值的问题
(1) perl中没有专门的布尔值类型
(2)任何的标量都可以成为控制结构的判断条件
(3)表达式返回的真假值保存到变量中,在判断的时候可以直接检查该变量的值!
明确:表达式不一定是逻辑表达式,但一定要得出真假!
假值的场景
(1)如果是数字,0为假,其余为真!
(2)如果是字符串,''空串为假,'0'也为假,其余字符串为真!
(3)逻辑值为假-->数字比较和字符串比较为假,逻辑运算符的结果(||,&7等)
(4)列表为空
(5)未定义-->(变量未定义,声明一个变量未定义-->undef)
(6)读取到文件的末尾(此时是undef-->未定义)
# 说明:上面的场景最终都会转换为undef,其余的场景为真!
备注1:Python中有(True,False)的布尔类型
备注2:shell中是通过命令回传码(逻辑运算符的底层还是回传码)判断是否执行相应的代码!
细节:如果是假,低版本的perl返回的是undef,高版本的perl返回的是空!
技巧:!会对判断的结果进行反转
1.3)关于perl的短路计算和//
特别:perl的短路计算非常特别,它返回的是最后运算的表达式的值
my $name = $myname || "malongshuai"
=cut
(1)当$myname变量存在时(0除外),它返回真,并将$myname赋值给$name;
(2)当$myname变量不存在时它返回假,于是评估"malongshuai",因为是个字符串,所以返回真,于是将malongshuai赋值给$name。
细节:但是如果$myname变量存在,但值为0(字符串的或数值的),由于它也返回假,导致$name被赋以"malongshuai"。
=cut
改进:
#(1)先判断再赋值-->defined特点-->真(1),假(undef)
my $name = defined($myname) ? $myname : "malongshuai";
升级:上述写法太复杂,perl 5.10版本以后提供了更方便的"逻辑定义或"(logical defined-or)操作符//
:
use 5.16;
my $name = $myname // "malongshuai";
特点:只要发现左边的值是已经定义过的(不管是0还是'',还是'0'),直接进行短路计算,而不管该左边的值评估后是真是假!