一、运算符
注:shell的数字和字符串的比较与perl相反!
二、相关概念
三、算术运算符
# 说明1:+号操作符号两边需要数字(上下文的需要)会将字符串转化为数字!
print 1+"1.8" ."\n"; #2.8
# 说明2:如果开启"use warnings"会有内置警告,但是不会报错!
# 字符串中非数字的部分(前置的空白符号)被忽略
print "10dwfewf" *"3.1"; #31
print "(1)对小数取余截取整数:";
$a=25.6%7.6;
print $a; #4
print "(2)指数为小数的幂运算:";
$b=(25)** 1.5;
print $b; #125
四、数字比较符
说明:perl的比较操作符和bash完全相反。数值比较采用符号,字符串比较采用字母(文本形式)!
print 35 == 30+5; #1(真)
print "\n";
# 说明:假的话不输出-->但是可用于if条件判断!
print 35 !=30+5; #假(没有输出)
print 35 ==35.0; #1(真)
print 35 <'40'; #1(真)
print 20>='18'; #1(真)
# 数字比较"<=>"(会转换为数字)
print 3<=>2; #1
print 0<=>'fdjsf'; #0,说明(有警告)
print '2'<=>'3'; #-1
五、字符串比较
练习
"""
数值 字符串 意义
-----------------------------
== eq 相等
!= ne 不等
< lt 小于
> gt 大于
<= le 小于或等于
>= ge 大于或等于
<=> cmp 返回值-1/0/1
"""
最后一个<=>
和cmp
用于比较两边的数值/字符串并返回状态码-1/0/1:
说明:每一种标点符号组合在Perl里有特殊含义!
# (1)字符串比较-->false(没有输出)
print 35 eq '35.0'; #没有输出
# (2)自动把操作数转化为字符串
print 123 lt 45; #1 ('123' lt '45' ,因为1<4,字符串从左到右比较);
# (3)特殊的比较
print 123 gt $a; #1 (未定义转换为空串,就是字符0,'1'>'0')
# (4)特殊的比较
print 1234 lt 1243; #1 逐个比较(到第三位, '3' <'4')
六、字符串运算符
练习
use strict;
use warnings;
#(1)连接操作符-->字符串可以通过.操作符"显示"使用连接操作符!
print "hello "."linux\n";
# 有空格
print "hello " ."java\n";
print "hello".' '."c++\n";
# 注意:中间必须有空格,会将123转化为字符串然后拼接
print 123 ."\n";
#(2)重复操作符-->语法:字符串 x 数字,必须有空格!
print "hello " x 3 ."\n";
# 特殊1-->左操作数不是字符串
print 123 x 3 ."\n";
# 特殊2-->右操作数不是自然数(小数或者字符串非数字或者字符串数字)
# 特点是截取,(不说是取整,是因为取整有上取整和下取整)
print 'have' x "3.1" ."\n";
# 说明:右操作数会变成0,所以没有输出!
print 'fhdsj' x "defle" ."\n";
# 前置0的只对直接量有效(表示8进制),不能用于字符串的自动转换,自动转换总是按照十进制数字来处理!
print 'a' x 0177 ."\n"; #会将8进制转化为10进制,然后计算!
print 'a' x '0177' ."\n"; #0177自动转换为十进制,就是177
# 说明:二者的打印不同
说明:Perl常常会根据需要自动在数字和字符串之间进行类型转换,是如何转换的呢?
通过上下文类型,这里完全取决于操作符!
举例:+需要数字,Perl会将操作数视为数字;.需要字符串,Perl就会将操作数视为字符串!
七、逻辑运算符
语法格式
# expr1 < and or && || // > expr2
# <not !>expr
细节
(1)&&运算符只有两边为真时才返回真,且短路计算:expr1为假时直接返回false,不会评估expr2!
(2)||运算符只要一边为真时就返回真,且短路计算:expr1为真时直接返回true,不会评估expr2!
(3)and和or基本等价于对应的&&和||,但文字格式的逻辑运算符优先级非常低!
(4)not和!求反,同样文字格式的not的优先级很低!
(5)因为符号格式的逻辑运算符优先级很高,所以往往左边和右边都会加上括号,而文字格式的优先级很低,左右两边不需加括号!
举例
if (($n >=18) && ($n <18)){
print "...";
}
if ($n >=18 and $n <18){
print "...";
}
#说明1:类似shell编程,这里暂时不考虑条件判断!
#说明:shell判断是根据命令的回传代码,其实是把每一个命令当成一个函数!
or
运算符:往往用于连接两个,如果前面的成功就执行(不判断后面的),否则就执行后面的子句!
#需求:打开文件,如果打开失败,就结束该perl程序!
open LOG '<' "/tmp/a.log" or die "Can't open file!";
上面的缩进的等价方式
open LOG '<' "/tmp/a.log"
or die "Can't open file!";
三个等价语句
if ($m<$n){$m=$n}
$m=$n if $m<$n; #有点类似Python的感觉!
$m=($m < $n) ? $n : $m;
说明:条件判断放在逻辑控制中讲解!