一、数据类型(Data Type)
Perl的数据类型大致可以分为四类:Scalar(标量)、Array(数组)、Hash(哈希)以及Reference(引用)。
1、Scalar(标量)
标量是Perl中最简单的一种数据类型,也是构成其他三个数据类型的基石。标量变量可以代表一个字符、字符串以及数字(整数或浮点数)。
1-1、数字
在Perl内部,它总是以“双精度浮点数(double-precision floating-point)”的要求来保存数字并进行运算。
浮点数直接量
1.25
255.000
7.25e45
-6.5e24
整数直接量
Perl允许我们在整数直接量中插入下划线
0
2001
-4
61_298_040
非十进制的整数直接量
八进制(octal)直接量以0开头,十六进制(hexadecimal)直接量以0x开头,二进制(binary)直接量以0b开头。十六进制的A到F(or a到f)代表十进制的10到15
0377 # 八进制的377,等于十进制的255
0xff # 十六进制的FF,等于十进制的255
0b11111111 # 二进制,等于十进制的255
0x50_65_72_7c #十六进制
1-2、字符串
单引号内的字符串直接量
在单引号内的字符串直接量除了单引号和反斜线字符外,单引号内所有字符都代表它们自己(包括换行符)。如需代表反斜杠字符本身,需要再反斜线字符前再加一个反斜线字符表示转义
'fred' # 总共4个字符:f,r,e,d
'hello\n' #hello后面接着反斜线和字母n
'\'\\' # 单引号紧接着反斜线(总共2个字符)
双引号内的字符串直接量
双引号中的反斜线可以转义许多控制字符,或是用八进制或十六进制写法来表示任何字符。
"hello world\n" # hello world,后面接着换行符
coke\tsprite # coke、制表符(tab)和sprite
\x{
2668} # Unicode中名为HOT SPRINGS的字符的代码点(code point)
双引号内字符串的反斜线转义
组合 | 意义 |
---|---|
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\f | 换页符 |
\b | 退格 |
\a | 系统响铃 |
\e | ESC(ASCII编码的转义字符) |
\007 | 八进制表示的ASCII值(此例中007表示系统响铃) |
\x7f | 十六进制表示ASCII值(此例中7f表示删除键的控制代码) |
\x{2744} | 十六进制表示的Unicode代码点(这里的U+2744表示雪花形状的图形字符) |
\cC | 控制符,也就是Control键的代码(此例表示同时按下Ctrl键和C键的返回码) |
\ | 反斜线 |
\ | 双引号 |
\l | 将下个字母转为小写的 |
\L | 将它后面的所有字母都转为小写的,知道\E为止 |
\u | 将下个字母转为大写的 |
\U | 将它后面的所有字母都转为大写的,知道\E为止 |
\Q | 相当于把它到\E之间的非单词(non word)字符加上反斜线转义 |
\E | 结束\L、\U和\Q开始的作用范围 |
字符串操作符
字符串连接(.)
"hello" . "world" # 等同于"helloworld"
'hello world' . "\n" #等同于"hello world\n"
字符/字符串重复(x)
"fred" x 3 # 得"fredfredfred"
5 x 4.8 #本质上就是 5 x 4, 得 "5555"
Perl会根据需要,自动在数字和字符串之间进行类型转换。是否发生转换由操作符决定,如果操作符(如+)需要的是数字,Perl就回将操作数视为数字;在操作符(比如.)需要字符串时,Perl便会将操作数视为字符串。
# “前置零”的技巧只对直接量有效
0377 # 十进制数字255的八进制写法
'0377' # 会转换成十进制数字377
"Z" . 5 * 7 # 等同于"Z".35,得"Z35"
2、List(列表)和Array(数组)
列表(list)指的是标量的有序集合,数组(array)是存储列表的变量。更精确的说,列表指的是数据,而数组指的是变量。
2-1、列表
列表是包含在括号里的一序列的值,可以为任何数值,也可为空
(1,2,3) # 包含1、2、3三个数字的列表
( ) # 空列表——0个元素
(1..100) # 100个整数构成的列表
("fred","barney","betty","wilma","dino")
qw简写可以省去键入无谓引号的麻烦,定界符(delimiter)可以hi任何标点符号,如:()、!、/、#、{}、[]、…
qw( fred barney betty wilma dino )
qw! fred barney betty wilma dino !
qw/ fred barney betty wilma dino /
qw# fred barney betty wilma dino #
列表的赋值:
($fred, ¥barney, $dino)=("A", "B", "C")
2-2、数组
列表存贮于Perl数组变量中,与简单变量不同,Perl数组变量以字符”@”打头,如
@array=(1,2,3);
注:
(1)Perl数组变量创建时初始值为空列表:()。
(2)Perl中数组变量和标量标量处于不同的命名空间,所以同一个变量名可以同时用作数组变量和标量变量而不用担心命名冲突。所以同一个名字可以同时用于Perl数组变量和简单变量
数组中元素可以通过下标操作符[]表示,第一个元素的下标为0,最后一个元素的下标为-1。试图访问不存在的数组元素将得到undef,如果给超出数组大小之外的元素赋值,则Perl数组将自动增长,原来没有的元素的值为undef。如下:
my @arr = (1, 2, 3);
my $var = $arr[5]; # $var will get undef
$arr[5] = 8; # @arr changes to (1,2,3,undef,undef,8)
最后一个元素的索引值是$#rocks
3、Hash(哈希)和散列
哈希是一种数据结构,它和数组的区别在于:不像数组以下标来检索元素,哈希使用键来检索元素。哈希结构中每一个元素都有一个键和一个值,键必须唯一。
my %hash = (1 => "fred", 2.5 => 1, "fred" => 2.5);
符号”=>” 在Perl中被戏称为胖箭头,它很好的展示了哈希结构中键与值的映射关系。
在Perl中胖箭头”=>”与逗号”,”是完全等价的,因此上面右边的散列中的胖箭头完全可以用逗号代替。使用胖箭头的唯一理由就是它清晰的表达了各个键与值映射关系。
访问哈希元素:$hash{$some_key}
访问整个哈希:%family_name
哈希赋值:my %new_hash = %old_hash
建立一个反序的哈希:my %inverse_hash = reverse %any_hash
4、引用(reference)和地址
应该说引用使得Perl中数组和哈希变的更加灵活而强大。引用表达的是一种“指向”的关系,因此它类似于C语言中的指针。比如你创建一个引用让它指向一个数组:
my $ref1 = \@arr;
my $ref2->[0] = "first";
$ref2->[2] = 3;
这两种方法都会创建一个引用,第一个方法要求数组@arr已经被声明。第二种方法更像是创建了一个类似于数组的怪物,之所以说它是怪物是因为你如果需要访问数组的某个元素,你只能使用箭头符号”->”来完成下标的指定ÿ