最近要分析一个perl的程序 , 之前没有接触过这门脚本语言 , 现在刚好学习一下~
本章重点 : Perl 三个基本数据类型
Helloworld
与其他脚本语言类似 , perl 可以采用 交互式编程 , 也可以采用 脚本式编程
- 交互式编程
-
脚本式编程
脚本中所有类型的空白( 比如 tab , 空格 , 空行 ... ) , 只要它们在引号外 , 那么解释器就会忽略它 , 如果它们在引号内 , 那么输出函数( 比如 print() )会原样输出空白
注释
-
单行注释
在每行之前添加字符
#
-
多行注释
perl中多行注释最常用的方法为 : POD( Plain Old Documentations )
=pod , =cut 只能放在行首
POD语法以 " = " 作为开头 , 后面至少接一个字符 , 比如 " =pod "
POD语法以 " =cut " 作为结尾 , 后面可以不跟其他字符
单引号和双引号
双引号可以正常解析一些转义字符或者变量 , 单引号则无法解析它们并原样输出
双引号中有单引号 , 双引号中有双引号 , 都需要添加 " \ " 进行转义
单引号中有双引号 , 双引号中有单引号 , 都不需要进行转义
Here Document
Here Document 是一种在命令行( sh , bash , csh , PowerShell ... ) 和 编程语言( Perl , Python , PHP , Ruby ) 中定义字符串的方法
<<"EOF"; 作为 Here Document 的开头 , 后面必须接分号 " ; " , 否则编译不通过
其中 EOF 外可以加单引号 , 双引号 或者不加引号 . 不加引号和使用双引号效果相同 , 会解析内嵌的变量或者转义字符 . 使用单引号则不解释内嵌的变量或者转义字符
结尾处的EOF关键字必须在行首且独自为一行 , 不能衔接任何符号和字符
EOF关键字可以换成任意字符 , 但要保证开始和结尾使用相同的字符
在 Here Document 中需要内嵌引号时 , 不需要添加转义字符 " \ " , 因为 Here Docuement 本身对单双引号转义
Perl 标识符
在程序中使用的变量名 , 常量名 , 函数名 , 语句块名统称为 标识符
- 标识符由 英文字符 , 数字 , 下划线( _ ) 组成
- 标识符开头仅能为 英文字母 或者 下划线
- 标识符区分大小写 , $a 和 $A 表示两个不同的变量
Perl 三个基本数据类型
- 标量
Perl中定义标量为 :
$ + 标识符名
, 这种数据类型可以是数字 , 字符串 , 浮点数 ... 不做严格的区分 -
数组( 或者叫列表 )
Perl中定义数组为 :
@ + 标识符名
, 索引从 0 开始 -
哈希( 或者叫关联数组 )
Perl中定义哈希为 :
% + 标识符名
, Hash就是个无序的key - value
, 可以使用key
作为下标去获取value
Perl 变量
变量是存储在内存中的数据 , 创建一个变量就会在内存上开辟一个空间 .
解释器会根据变量的类型来决定其在内存中的存储空间 , 因此可以为变量分配不同的数据类型( 标量 , 数组 , 哈希 , ... )
因此变量不需要显式声明类型 , 在变量赋值后 , 解释器会自动分配匹配的内存空间 . 如果需要强制声明类型 , 可以在程序中使用 use strict
语句
Perl会为每个变量设置独立的命名空间 , 不同类型的变量可以使用相同的变量名 . 如下所示
- 创建一个标量 :
$a = 'aaa' , $b = 'bbb';
- 创建一个数组 :
@a = ('a','b','c','d');
- 创建一个哈希 :
%a = ('a' => 'aaa' , 'b' => 'bbb');
变量上下文
感觉这里是个重点 , 上下文是指表达式所在的位置
上下文是由等号左边的变量类型决定的 , 等号左边是标量 , 则是标量上下文 , 等号左边是列表 , 则是列表上下文 . Perl解释器会根据上下文来决定变量的类型
当将列表赋值给标量时 , 返回的是列表中元素的个数
标量
- 整型
Perl把整数存储到计算机的浮点寄存器中 , 所以整数实际上是被当作浮点数看待的 . 在大多数计算机中 , 浮点寄存器可以存储16位数字 , 长于16位的数会被丢弃 . 整数实际上是一种特殊形式的浮点数
八进制整数表示 : " 0 + 八进制数 "
十六进制整数表示 : " 0x + 十六进制数 "
-
浮点数
前面提到大多数计算机的浮点寄存器只能存储16位数字 , 所以浮点寄存器往往不能精确存储浮点数 , 会产生误差指数形式的数据也看作浮点数( 例如 4.3e+01 ) , 指数的范围为 [-309 , 308]
这里计算存在很大误差
-
字符串
字符串的使用与C语言类似 , 需要注意在Perl中字符串不能用\0来表示结束字符串中的单双引号的使用需要注意 , 双引号可以正常解析转义字符和变量 , 单引号不可以 .
-
标量运算
+
: 两数相加
*
: 两数相乘
.
: 拼接字符串 / 拼接字符串或者数字 -
多行标量
可以使用引号包围 , 也可以使用 Here Document 语法
教程上说暑促多行字符串需要使用单引号( '' )而不是双引号( "" )
-
特殊字符
三个例子(
__FILE__
,__LINE__
,__PACKAGE__
) , 这些特殊字符是单独标记的 , 不能写在字符串中 -
v字符串
一个以
v
字开头 , 后面跟着一个或多个用点分割的整数 , 会被当成一个字符串文本简单的说 , 在输出时 , 如果这些整数可以被转换为ASCII字符 , 那么会被转换为字符 . 如果出现宽字符等Perl无法识别的内容 , 那么会被转换为十六进制的字符实体编码 , 以
&#x
开头 . ( Perl 只能处理 ASCII 和 UTF-8 , 如果 , 若出现Perl无法识别的字符 , 则会产生Wide character in print
警告 )若想为每个字符直接声明其数字值时 , 可以使用这种
v
字符串方法
数组
Perl中数组是一个存储标量值的列表变量 , 这些标量值可以是不同类型的
若要访问数组元素 , 可以使用 "$ + 变量名 + [ 索引值 ]
" 的格式来读取
- 创建数组
创建数组时 , 可以使用
@ + 变量名
直接创建 , 也可以使用qw//
运算符定义 , 或者是分别对空数组的每个索引进行赋值 .qw//
运算符会返回字符串列表 , 列表中的元素以空格分割 , 所以可以用来创建数组 -
访问数组元素
可以通过
$ + 变量名 + [ 索引值 ]
来访问数组 . 索引值可正可负 . 正数表示从前往后读取 , 负数则是从后往前读取注意从前往后读取 , 第一位为 " 0 " . 从后往前读取 , 第一位为最大索引位
-
数组序列号
Perl 提供了可以按序列输出的数组形式 , 格式为
启始值..结束值
-
数组的大小
数组的大小由赋值的标量上下文决定的 , 这点前面已经提到过了
注意数组的大小是指数组物理大小 , 而不是数组中元素的个数
可以看到数组中的元素只有21个 , 但是数组的大小为51
$# + 变量名
返回数组的最大索引值( 从 0 开始 ) -
添加或者删除数组元素
Perl提供了一些有用的函数来添加或者删除数组元素
-
切割数组
可以根据索引值切割一个数组
切割时的数组索引需要是有效的值 , 可以是正数或者负数( 无论正负都需要是由小到大启动 )
每个索引值需要用逗号分割 , 如果想要连续的索引 , 可以使用
..
来指定范围 -
替换数组元素
可以使用
splice()
函数来替换数组中的元素splice(@ARRAY , OFFSET , LENGTH , LIST)
@ARRAY : 原数组
OFFSET : 从什么地方开始 , 注意这里是指索引 , 索引从 0 开始
LENGTH : 替换元素的个数
LIST : 替换元素的列表 -
将字符串转换为数组
Perl中使用
splce()
函数将字符串转换为数组split(PATTERN , EXPR , LIMIT)
PATTERN : 分割符 , 默认为空格
EXPR : 需要分割的字符串
LIMIT : 若设置该值 , 将会指定进行多少次分割 -
将数组转换为字符串
Perl中使用
join()
将字符串划分为数组join(PATTERN , EXPR)
PATTERN : 连接符 , 必须指定
EXPR : 要转换的列表或者数组 -
数组排序
Perl中使用
sort()
函数进行数组排序sort(SUBROUTINE , LIST)
SUBROUTINE : 可选参数 , 指定排序规则
LIST : 需要排序的列表数组排序默认是按照ASCII数字的大小进行排序的 , 因此在对数组进行排序时最好将每个元素全部转换为小写后再排序
-
特殊变量
$[
首先说下这个变量已经被弃用了 , 在 Perl 5.30 中将会生成错误
特殊变量
$[
表示数组的第一索引值 , 默认为0 , 但是如果将$[
设置为 1 , 那么数组的第一个索引值就变为了 1 , 依次类推 -
合并数组
数组中的元素是用逗号分割的 , 这些元素也可以是数组 , 所以可以在数组中嵌入多个数组
-
批量提取数组中的元素
哈希 HASH
哈希就是键值对的集合 , 也被称为关联数组 , Perl中哈希变量以百分号 " % " 标记开始
可以使用 $hash{key}
来获取对应的值
- 创建哈希
哈希可以通过赋值创建 , 也可以通过列表方式创建
-
访问哈希元素
通过
$ + 变量名 + { key }
来访问哈希元素 -
批量读取哈希值
通过
@ + 变量名 + { key1 , key2 , ... }
来读取哈希值 -
读取所有的哈希 key 和 value
通过
keys + % + 变量名
和values + % + 变量名
可以获取到所有的 key 和 value -
检测元素是否存在
在哈希中读取不存在的键值对时 , 会返回 undefined 值 , 并且在执行时会产生警告
可以使用
exists()
函数来判断key是否存在 -
获取哈希的大小
哈希的大小是指元素的个数 , 可以通过获取 key 或者 value 的值 , 把他们组成一个数组 , 再读取这个数组的大小.
-
添加或者删除元素
通过赋值的方法添加键值对 , 通过
delete()
函数删除键值对.
总结
本章总结了 Perl 三个基本数据类型的知识