Previous Next Contents

7    Perl 的变量

7.1    简单变量

Perl 的 Hello World 是怎么写的呢?请看下面的程序:

#!/usr/bin/perl
print "Hello World"

这个程序和前面 BASH 的 Hello World 程序几乎相同,只是第一行换成了 #!/usr/bin/perl ,还有显示的时候用的是 print,而不是 echo。有了前面 BASH 基础和 C 语言的基础,许多 Perl 的知识可以很容易的就看懂和记住,下面我们就从简单变量开始。

简单变量是标量,是 Perl 处理的最简单的数据类型。标量可以是数字(如2,3或2.5e6), 也可以是字符串。Perl 中的标量变量以美元符号 "$" 和一个字母开始,后面可以跟字母、数字和下划线,Perl 的变量区分大小写,因此 $a 和 $A 是代表不同的变量。和 BASH 中不同的是 Perl 语言中的变量即使是在最初赋值的时候也必须在变量前面加上 "$" 符号,而且 Perl 不要求 "=" 左右必须没有空格。

虽然 Perl 中和 BASH 一样,没有变量类型的概念,我们还是可以把简单变量分为数值型和字符串型来理解。在赋值时,如果是赋值成字符串,则需要在字符串两边加上双引号(或单引号);如果是数值则就不用了,而且 Perl 中还可以接受8/16(以0开头/以0x或0X开头)进制的整数,还可以接受如 2.5,-6.3e5,-2.3-e6 这样的浮点数。关于简单变量举例如下:

$a=23;
$a = "hello";
$a = 010;(表示十进制的 8)
$a = 0x10;
$a = 0X10;

和 C 语言类似,在双引号之中可以用反斜杠表示一些特殊转义字符,见下表:

结 构 含 义
\n 换行
\r 回车
\t 水平置表符
\f 换页符
\b 退格
\v 垂直置表符
\a 响铃
\e Esc
\007 任一八进制ASCII值(这里007表示bell)
\x7f 任一十六进制ASCII值
\cC 任一“控制”字符
\\ 反斜杠
\" 双引号
\l 下一字母小写
\L 以后所有字母小写直到\E
\u 下一字母大写
\U 以后所有字母大写直到\E
\E 结束\L和\U

另外在 Perl 语言里,我们常会看到 my 这样的变量定义,如:

my $a = "local var";

这表示 $a 是一个程序块的局部变量。

 

7.2    数组

数组是标量数据的有序列表。数组可以含从 0 个元素大小 直到 你计算机内存可以支持的大小。数组用括号内以逗号分隔的一系列元素来表示。如:

@a=(1,2,3,4,5)
@a=("aka",1974,173.5)

在 Perl 中对数组变量和前面的简单变量的存储是在不同的空间中,对数组的引用需要在变量前加 "@" 符号。

数组的赋值由下面几种用法需要注意:

@a=(1,2,3); # 初始化一个整数数组。
$a=@a; # 这里表示将数组 @a 的长度赋给 $a,此时 $a 和 @a 不是一个变量,他们不在一个存储空间里,引用时不会发生混淆。
($a, $b, $c)=(1,2,3); # 这里表示将 1 赋给 $a;2 赋给 $b;3 赋给 $c;
@a=("a","b","c"); # 初始化一个字符串数组。
@b=@a; # 表示把数组 @a 拷贝一份给数组 @b,@a 与 @b 不享有共同的存储空间,他们彼此分离。
@c=(@a,@b); # 表示数组 @c 拥有 @a 和 @b 的所有元素,仍然是一维数组,而不是发生了嵌套。
($a,@b)=@a; # 表示变量 $a 等于数组 @a 的第一个元素,@b 拷贝了 @a 的剩余元素。
@a=(); # 表示产生或清空一个数组。
($a)=@b; 变量 $a 等于数组 @b 的第一个元素的值。
@b[i] 引用数组 @b 的第 i 个元素。
$b[i] 如果 b 表示一个数组的话,其含义同上。
$a[i,j]=[x,y] 将数组 @a 的第 i 和第 j 个元素赋值为 x 和 y。
@a[i,j]=@a[j,i] 将数组 @a 的第 i 和第 j 个元素的值互相交换。

 


7.3    关联数组

关联数组是 Perl 语言中特有的一种数据结构,是一个功能强大的数组,他与普通数组的不同在于关联数组不是通过整数下标来索引,而是通过“键值”进行索引。使用关联数组需要在变量前面加上 "%" 号,关联数组的格式如:

ARRAY=(key1,value1,key2,value2,key3,value3);

上面每个 key 都对应着一个 value。关联数组是存在在另外一个存储空间中,不和简单变量以及数组相混淆。

对关联数组的操作有如下规则:

  1. 在关联数组中增加、更改一对数据:ARRAY={key}=value; 在关联数组ARRAY中加上一对 key-value,要在关联数组名称前加上 $ 号,而且 key 的名称要在 {} 符号之间,最后再指定 key 所对应的 value 值。如果在这个关联数组中已经有这个 key 了.就会更改这个 key 所对应的 value 。

  2. keys(%array) 操作符可生成由关联数组 %array 中的所有当前关键字组成的列表。即返回奇数号元素(第1,3,5,7...个)的列表。

  3. values(%array) 操作符返回由关联数组 %array 中所有当前值组成的列表,即返回偶数个列表。

  4. echo(%array) 操作符返回由 关键字/值对 构成的元素对列表。对同一数组再进行此操作时返回下一对值直至结束。若没有更多的对时,echo() 返回空表。 (这在打印全部列表中很有用)

  5. 删除一对在关联数组中的数据:delete $ARRAY{key}; delete 是 Perl 所提供的函数,作用是删除关联数组中的一个 key 以及这个 key 所对应的 value。使用方法是在 delete 函数之后,指定关联数组中要删除的 key 名称。

下面是一些关联数组操作的例子:

%fred=(one,"aka",two,"free"); $a=$fred{one}; # $a等于"aka"
$b=$fred{two}; # $b等于"free"
$fred{two}="yes"; # %fred=(one,"aka",two,"yes")
@index=keys(%fred); # @index=(one,two)
@content=values(%fred); # @content=("aka","yes")
($index,$content)=echo(%fred); # 此时 $index 的值为 one,$content 的值为 "aka",再执行一次 $index 为值为 two,$name 的值为 "yes"
@a=%fred; # 将关联数组 fred 指定给数组 a,这时 @a=(one,"aka",two,"yes")
%b=@a; # 将数组 a 指定给关联数组 b,这时 %b=(one,"aka",two,"yes")
delete $fred{one}; # 将关联数组中 key 值为 one 的一对 key-value 删除,这时 %fred=(two,"yes")
%x=(); # 把 %x 关联数组置空

 

7.4    各种运算符号汇总

赋值(Assignment)运算符
算术(Arithmetic)运算符
数值(Numeric Values)关系运算符
字符串(String Values)关系运算符
逻辑(Logical)运算
其它常用的运算符
常用的文件数据(File Test)运算符

 
赋值(Assignment)运算符


符号 范例 说明
= $x=$y; 将$x的值指派给$y
+= $x+=$y;
$x=$x+$y;
将$x加$y之后再指派给$x
-= $x-=$y;
$x=$x-$y;
将$x减$y之后再指派给$x
*= $x*=$y;
$x=$x*$y;
将$x乘$y之后再指派给$x
/= $x/=$y;
$x=$x/$y;
求出$x除以$y之后的商数,再指派给$x
**= $x**=$y;
$x=$x**$y;
将$x乘上$y次方之后再指派给$x
%= $x%=$y;
$x=$x%$y;
求出$x除以$y的余数以后,再指派给$x
.= $str1.=$str2;
$str1=$str1.$str2;
将$str1这个字符串再加上$str2这个字符串之后,再指派给$str1这个字符串
x= $strx=$y;
$str=$strx$y;
重复$str字符串$y次,并反结果指派给str这个字符串

算术(Arithmetic)运算符
 

 
符号 范例 说明
+ $z=$x+$y 将$x和$y相加之后,再将结果指派给$z
- $z=$x-$y 将$x减掉$y之后,再将结果指派给$z
* $z=$x*$y 将$x和$y相乘之后,再将结果指派给$z
/ $z=$x/$y 将$x除以$y之后,再将商数指派给$z
% $z=$x%$y 将$x除以$y之后,再将余数指派给$z
** $z=$x**$y 将$x乘以$y之后,再将结果指派给$z
++ $x++;++$x; 如同$x=$x++1;将$x加一以后再将结果指派给$x
-- $x--;--$x; 如同$x=$x-1;将$x减一以后再将结果指派给$x
. $z=$x.$y; 将$x字符串和$y字符串连接之后,再将结果指派给$z

数值(Numeric Values)关系运算符


符号 范例 说明
> $x>$y 如果$x大于$y,返回1的值,否则返回0
>= $x>=$y 如果$x大于等于$y,返回1的值,否则返回0
< $x<$y 如果$x小于$y,返回1的值,否则返回0
<= $x<=$y 如果$x小于等于$y,返回1的值,否则返回0
== $x==$y 如果$x等于$y,返回1的值,否则返回0
!= $x!=$y 如果$x不等于$y,返回1的值,否则返回0
<=> $x<=>$y 如果$x大于$y,返回1的值,如果$x等于$y,否则返回0;&127;如果 $x小于$y,则返回-1的值

字符串(String Values)关系运算符


符号 范例 说明
gt $str1 gt $str2 如果$str1大于$str2,返回1的值,否则返回0
ge $str1 ge $str2 如果$str1大于等于$str2,返回1的值,否则返回0
lt $str1 lt $str2 如果$str1小于$str2,返回1的值,否则返回0
le $str1 le $str2 如果$str1小于等于$str2,返回1的值,否则返回0
eq $str1 ep $str2 如果$str1等于$str2,返回1的值,否则返回0
ne $str1 ne $str2 如果$str1不等于$str2,返回1的值,否则返回0
cmp $str1 cmp $str2 如果$str1大于$str2,返回1的值,如果$str1等于$str2,返回0,如果$str1小于$str2,则返回-1的值
逻辑(Logical)运算

1) $x && $y(And)

$x    $y    结果

真(True) 真(True) 真(True)

真(True) 假(False) 真(True)

假(False) 真(True) 假(False)

假(False) 假(False) 假(False)

2) $x || $y(Or)

$x    $y    结果

真(True) 真(True) 真(True)

真(True) 假(False) 真(True)

假(False) 真(True) 真(True)

假(False) 假(False) 假(False)

3) $x(Not)

$x    结果

真(True) 假(False)

假(False) 真(True)


其它常用的运算符

指令:..区块运算符(Range Operator)

说明:这个运算符是 Perl 语言中特有的运算符,是一个很实用的运算符。

范例:

@digits=(1..9); # 此时 @digits=(1,2,3,4,5,6,7,8,9);
@digits=('01'..'05'); # 此时 @digits=(01,02,03,04,05);
@char=('A'..'E'); # 此时 @char('A','B','C','D','E',);
@total=(1..3,'A'..'B'); # 此时 @total=(1,2,3'A','B');

指令: 条件运算符(Conditional Operator)

说明: (判别运算式? 运算式1: 运算式2)这个语法的意义和C语言一样:如果判别运算式的值是真(True)的话,则做运算式 1 的运算;如果判别运算式是假(False)的话,则做运算式 2 的运算。

范例:

$price = ($age>60)? 100:200;
如果 $age 大于60的话,则$price等于100,否则$price等于200。


常用的文件数据(File test)运算符



范例 说明
-r $file 如果 $file 是可读取的话,返回 1
-w $file 如果 $file 是可写入的话,返回 1
-x $file 如果 $file 是可执行的话,返回 1
-e $file 如果 $file 存在的话,返回 1
-s $file 返回 $file 的文件大小(bytes)
-f $file 如果 $file 是正常文件的话,返回 1
-T $file 如果 $file 是文本文件的话,返回 1
-B $file 如果 $file 是Binary文件的话,返回 1
-M $file 返回 $file 文件最后一次更改时间到现在的日期数

 

 




Previous Next Contents