Perl 是一种弱类型语言,所以变量不需要指定类型,Perl 解释器会根据上下文自动选择匹配类型;
Perl 有三个基本的数据类型:标量、数组、哈希;以下是这三种数据类型的说明:
序号 | 类型和描述 |
---|---|
1 | 标量 标量是 Perl 语言中最简单的一种数据类型。这种数据类型的变量可以是数值,字符串,浮点数,不作严格的区分;在使用时在变量的名字前面加上一个 $,表示是标量,例如: |
2 | 数组 数组变量以字符 @ 开头,索引从 0 开始,如:@arr=(1,2,3) 引用单个的数组元素,使用中括号加 $ 的形式,如:$arr[0] |
3 | 哈希 哈希是一个无序的 key/value 对集合。可以使用键作为下标获取值;哈希变量以字符 % 开头
|
标量
数值
Perl 实际上把整数存在计算机中的浮点寄存器中,所以实际上被当作浮点数看待,这也就是说perl中以双精度浮点数的方式保存数字变量
在多数计算机中,浮点寄存器可以存贮约 16 位数字,长于此的被丢弃,整数实为浮点数的特例
数字变量的算数运算包括:+ - * / % **,这里幂运算的优先级最高,当有多个幂运算时, ** 的优先级是从右到左的:
$x = 12345;
if (1217 + 116 == 1333) {
# 执行代码语句块
}
8 进制和 16 进制数:8 进制以 0 开始,16 进制以 0x 开始。例如:
$var1 = 047; # 等于十进制的39
$var2 = 0x1f; # 等于十进制的31
浮点数
浮点数数据如:11.4 、 -0.3 、.3 、 3. 、 54.1e+02 、 5.41e03。
浮点寄存器通常不能精确地存贮浮点数,从而产生误差,在运算和比较中要特别注意;指数的范围通常为 -309 到 +308;
字符串
Perl 中的字符串使用一个标量来表示,定义方式和 c 很像,但是在 Perl 里面字符串不是用 \0 来表示结束的;
Perl 双引号和单引号的区别: 双引号可以正常解析一些转义字符与变量,而单引号无法解析会原样输出;
perl中可以使用多行文本,如下所示:
‘
改成双引号的结果同上面是一样的,并不会将空格忽略!!
- 引号的文本形式
- q相当于单引号
- qq相当于双引号
- qx相当于反引号
q(hello world) # 等价于'hello world'
qq(hello world) # 等价于"hello world"
qx(echo hello world) # 等价于`echo hello world`
Perl 语言中常用的一些转义字符如下表所示:
转义字符 | 含义 |
---|---|
\\ | 反斜线 |
\' | 单引号 |
\" | 双引号 |
\a | 系统响铃 |
\b | 退格 |
\f | 换页符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\0nn | 创建八进制格式的数字 |
\xnn | 创建十六进制格式的数字 |
\cX | 控制字符,x可以是任何字符 |
\u | 强制下一个字符为大写 |
\l | 强制下一个字符为小写 |
\U | 强制将所有字符转换为大写 |
\L | 强制将所有的字符转换为小写 |
\Q | 将到\E为止的非单词(non-word)字符加上反斜线 |
\E | 结束\L、\U、\Q |
来看下面转义字符与单双引号的例子:
- 字符串的连接和重复
字符串连接使用 . ,字符串重复使用小写字母 'x',后面跟重复的倍数,如果倍数是小数则会取整,如果倍数小于1则返回空;看下面例子:
小写字母 x 左边的变量会自动转换为字符串,如下:
- 数值和字符串的类型自动转换
什么时候转换,以及向哪个方向转换,取决于操作符;
例如对于算数运算符(+ - * / 等),会强制将字符串转换为数值,而对于 . 操作符需要的是字符串,会强制将数值转换为字符串,如下:
perl变态的一个地方是,以数字开头的字符串也可以强制转换为数值,但是只能转换数字开头(允许前导空白)的字符串,如下:
对于两种运算符一起使用时,会按照优先级进行转换后再运算,如下:
\
heredoc
所谓 heredoc 就是将后面的内容当做文档;既然是文档,就需要有文档起始符和文档结束符,分别标识文档从哪里开始和结束;
一般来说,所有支持 heredoc 的语言,文档的起始符和结束符都必须相同(一般使用EOF或eof作为起始符和结束符),且结束符必须单独占行且顶格书写;
使用概述:
- 1.起始符必须后接分号,否则编译通不过;
- 2.END可以用任意其它字符代替,只需保证结束标识与开始标识一致;
- 3.结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符);
- 4.开始标识可以不带引号号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号;带反引号则将字符串放进shell环境执行;
- 5.当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义,此处相当与q和qq的用法;
自增和自减
perl不仅支持数值类型的自增和自减,还支持字符和字符串的自增和自减,如下:
可以看到,字符串的自增是将字符串的最后一个字符加1,也就是a-->z,A-->Z,如果是最后一个字符是Z或z,那么再先前一个字符进位,如上面15行;
undef 和 defined() 函数
undef 表示变量未定义,它不等于字符串的空,也不等于数值0;
但是一般情况下,将undef 当作空或0就好了,因为在需要数值的时候,undef代表的就是0,需要字符串的时候,undef就是空字符串;
所以,perl中的完全可以直接使用未定义的变量,因为未定义的变量起始就是undef。它可以被当作0,也可被当作空字符串;
例如,下面两个语句中,$sum和$str都是未定义的,初始时它们分别表示数值0和空字串''
$sum += $i;
$str .= "abc";
可以直接将undef关键字赋值给某个变量,表示这个变量是undef的,这可以取消一个变量的定义,相当于bash shell中的unset: