数值和字符串

数值

* perl中以双精度(浮点数)方式保存和运算数值的方式
就算写的是整数,在内部也会转换成等效的浮点数类型保存。

但在perl内部,有些运算会将浮点数转换成整型进行,而且也有integer编译器可以强制编译成整型。

* perl中整数的表示方式
有3种方式:
123 0123 61_123_234
这里使用下划线(_)代替逗号表示千分位,因为perl中逗号有特殊意义。

* 算术运算 + - * / % **
**的优先级在这里最高。

取模时,先两个数取整,再取模。例如5.2 % 2.1等价于5 % 2。

多个取幂符号时,**的优先级是从右向左进行的。
3 ** 4 ** 2 # 3 ** (4 ** 2) = 3的16次方
单双引号和反引号

perl对待单双引号的方式和shell有点类似。

* 单引号内,只有反斜线的转义效果存在(如\n不再是换行),其它全都当作字面符号(单引号自身除外)
* 双引号内,反斜线、反斜线序列(\n,\t...)、变量替换都允许
* 反引号内,内容会交给shell执行 'malong' 'malong\'s girl friend' 'malong\n' # 这里没有换行
"malong\n" # 换行了 'malong girl friend' # 换行了,因为这里的换行是字面符号,不是\n 'malong\\n' # 换行了
"malong $var" # 变量替换
有以下反斜线序列(转义序列):
\n \r \t \l # 将下个字母转换为小写 \L # 将后面的多个字母都转换为小写,直到遇到\E \u # 将下个字母转换为大写 \U #
将后面的多个字母都转换为大写,直到遇到\E \Q # 和\E之间的所有字符都强制当作字面符号 \E # \L、\U和\Q的结束符号
但即使没有"\E",到了字符串结束的地方,转义序列就会结束。例如:
print "\Uabc"."xyz\n" # 输出ABCxyz print "abc"."x\Eyz\n" # 输出abcxyz
反引号内的字符串会交给shell执行。这是和操作系统交互的一种方式,支持操作系统的管道、重定向等特性。另一种方式是使用system函数。
$mydatetime = `date +"%F %T"` print $mydatetime,"\n";
默认情况下,反引号内的内容会被perl先按照双引号的方式进行解析,然后传递给操作系统的shell执行。所以,当有变量替换时会进行变量替换:
$name="malongshuai"; $msg=`echo $name`; # 替换为echo malongshuai,然后交给shell print
$msg;
如果不想先被perl解析,可以使用qx和单引号结合的方式,关于qx,见下文。
$name="malongshuai"; $msg=qx'echo ha $name hei'; #
不会替换为malongshuai,而是将$name替换为空交给shell print $msg;
引号的文本形式:q、qq和qx

* q等价于单引号
* qq等价于双引号
* qx等价于反引号 q(hello world) # 等价于'hello world' qq(hello world) # 等价于"hello
world" qx(echo hello world) # 等价于`echo hello world`
上面的括号可以替换为其它符号,只要前后能配对(特指括号类)或者一致即可:
qq{ hello } qq! hello ! qq# hello # qq% hello %
字符串连接和重复

字符串连接使用点(.)。

下面是等价的:
abc.cde abccde
字符串重复使用小写字母"x",后跟一个重复倍数。如果倍数是一个小数,如3.2,则会取整。如果倍数小于1,则取整为0,所以倍数为0,返回空。
"abc" x 3 "abc" x 3.2
都将输出"abcabcabc"。
"abc" x 0.4 # 返回空
"x"符号左边会强制转换为字符串。
03 x 3 # 返回333 "03" x 3 # 返回030303 3 x 3 # 返回333 3.2 x 3 # 返回3.23.23.2
数值和字符串的类型自动转换

什么时候转换,以及向哪个方向转换,取决于操作符。

例如,算数运算符(+-*/等)需要的是数值,会强制转换为数值。"."操作符需要的是字符串,会强制转换为字符串。
"0333" + 22 # 返回355 "033".22 # 返回03322 033.22 #
返回2722,033表示8进制,转换为十进制为27(3*8+3)
perl变态的一个地方,数值开头的字符串也可以强制转换为字符串。但只能转换数值开头(允许前导空白)的字符串。
"12abc" * 3 # 36 "abc12" * 4 # 0 " 12abc" * 3 # 36
两种类型的操作符一起用的时候,会按照优先级进行运算:
"abc".5*3 # 返回abc15,乘法先运算 "abc".5 + 3 # 返回3,"."先运算 "abc".(5+3) # 返回abc8
heredoc


perl中也支持heredoc,所谓heredoc,即表示将后面的内容当作文档。既然是文档,就需要有文档起始符和文档结束符,分别标识文档从哪里起始,到哪里结束。

一般来说,所有支持heredoc的语言,文档起始符和文档结束符都必须相同(一般使用EOF或eof作为起始符和结束符),且结束符必须单独占行且顶格书写。

perl中支持的heredoc格式如下,以print为例:
print <<EOF; line1 line2 line3 EOF
* 这里以EOF作为文档起始符和结束符
* 起始符EOF后面必须加上分号结尾,分号后的所有内容都忽略(即使它后面的不是注释内容)
* 结束符EOF单独占用一行,且顶格书写
* 起始符和结束符中间是怎样的数据,输出时就是怎样的数据
perl的heredoc还有自己的特性,可以为起始符加上单引号和双引号以及其它符号。加单双引号后的效果和一般单引号、双引号的能力是一样的:

* 单引号是强引用
* 双引号是弱引用
* 不加引号等价于加双引号
* 加反引号`,则将字符串放进shell环境执行
加单双引号:
$name="malongshuai"; print <<'EOF'; haha \$name # 反斜线转义功能失效 $name # 变量无法替换 EOF
print <<"EOF"; haha \$name # 反斜线成功转义 $name # 变量成功替换 EOF
加反引号:
print <<`EOF`; date +"%F %T" EOF
可以将heredoc直接赋值给变量:
$msg = <<EOF; HELLO WORLD EOF print $msg; # $msg不要加换行符,因为$msg是一个heredoc,自带换行符

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信