Perl 语法简介
原文网址: http://www.cncfan.com/html/?71_620.html
1.PERL变量
1.1.Perl变量分类
Perl变量分为标量变量,数组变量,关联数组变量3类.PERL的变量对大小写敏感,比如:An,AN,an是3个不同的变量,但是不同类型的变量可以使用同一个名字,比如:VAR可以是一个标量变量,同时也可以有一个数组变量也是VAR.这是因为PERL对每种类型的变量采用独立的名字空间,另外PERL的变量,可以存储任何类型的数据,无须像C那样声明变量,数据类型之间会自动转换,同时PERL变量也有全局与过程变量之分,默认是全局变量.
1.2.Perl变量
1.2.1 Scalar变量(标量变量)
标量变量只能存放一个值.PERL中的标量变量名总以字符$开头.下面的PERL语句把9这个值赋给标量变量$nine.把"BATI"赋给标量变量$name.然后用PRINT语句打印出来.
$nine=9;
$name='BATI';
print($name,'is',$nine);
把上述语句存为TEST01.PL文件,然后再在DOS环境下(WIN9X的MS-DOS方式也可以)运行:
C:/PERL5>PERL TEST01.PL(回车)
BATI is 9
(什么?很眼熟??是阿,PERL和我们常用C就是这么相似)
1.2.2 数组变量
数组是一次能够存储多个变量的表.它的赋值方法如下:
@weekdays=('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
print (@weekdays); #输出为: SunMonTueWedThrFriSat
print ($weekdays[1]); #输出为: Sun
@work=@weekdays[1..5]; #此时,数组work的值为('Mon','Tue",...,'Fri');
@none=(); #表示空数组
数组变量名以@开头,[]内是数组的下标值,下标值从0开始.这与C依然很相似.
同样的在PERL中,如果只有数组名,而忽略下标的话,也会像C那样输出整个输出,比如:
第一个输出语句.
但请注意在输出Sun那一句时,当我们引用数组中某一个值的时候,我们不再使用@,而是使用$作为变量的开头,因为就单个值而言,它是一个标量变量,所以如此(这和C可不一样哦)当然你还得给出下标值.
在给数组work赋值的语句中,我们用到了SLICE初始化数组,你不必关心什么是SLICE,你只要记住这种形式就可以了,其实SLICE是表格的一部分,是官方的表示.
对数组的赋值是多种多样的.前面我们看到的都是用值对数组赋值,同样你也可以用变量或者另一个数组的值给数组赋值,比如:
@name=($firstname,@lastname);
@say=('He said',@saysomething);
以下是SLICE的例子:
@weekend=@weekdays[0,6]; #数组weekend的值为('Sun','Sat')
print(@weekdays[1..5,0,6]); #输出结果为'MonTueWedThuFriSunSat'
PERL还支持一种特殊构造符$#var,它是用来返回数组最后一个索引值.比如下面的语句利用$[构造符确定数组的第一个索引值,用$#var确定数组最后的索引值,然后显示整个数组:
for ($i=$[;$i<=$#buffer;$i++) { print $buffer[$i]; }
上面语句与print @buffer;的输出结果是一样的.
1.2.3 标量与数组变量
表构造符(,)与顺序计值运算符(,)非常相似.因此,PERL调用哪一个运算符取决于命令文件运行时的具体情况,即文件正在使用数组还是标量值.PERL在数组表达式中调用表结构符, 在顺序计值中调用计值运算符.请考虑以下两个表达式:
@an_array=(1,2,3,4,5);
$a_scalar=(1,2,3,4,5);
第一个语句初始化一个数组,第二句把$a_scalar变量的值设为5,而且取消了前4个元素的赋
值作用.
再来看一个例子:
print $assoc{1,2};
@print $assoc{1,2};
第一句打印二维关联数组的一个元素值,而第二句打印一维数组的两个元素值.
1.2.4 关联数组变量
关联数组变量与数组变量很相似,都可以存储标量变量的表.它们的区别在于数组变量必须通过整数下标来引用数组元素, 而关联数组变量可以通过任何值作为下标而达到访问数组元素的目的.关联数组的下标我们称之为键值(Key),是一种索引值.下面我们通过一个例子来理解:
$ages{'Bob'}=35;
$ages{'Mary'}=25;
$,='';
print @ages{'Bob','Mary'};
print keys(%ages );
for $name(keys(%ages))
{
print "$name is $ages{$keys}/n";
}
程序把一个值赋给'$,'变量,这样以后的print语句的输出会受到影响,关于特殊变量'$,'我们将在以后介绍.PERL调用关联数组变量时,使用花括号{}括起键值.
@ages{'Bob','Mary'}在花括号内给出了键值,表示引用一个元素,此语句中有两个键值,表示引用数组的一部分,其结果应为(35,25)与($ages{'Bob'},$ages{'Mary'})语句的结果相同.
print keys(%ages)使用了keys运算符.其结果将返回关联数组的所有键值,组成一个表.%ages表示引用整个关联数组.
请注意循环语句中的print语句,在这里我们看到了在""(双引号)中插入变量的用法,这是非常有用的.在输出结果的时候,变量将被替换成变量的值作为输出的最终结果,这就是所谓的内插法.但是PERL不允许在''(单引号)中插入变量!!!!
2.PERL运算符
2.1 算数运算符
Perl虽然在变量与数据类型都和C大不相同,然而它的运算符和C几乎相同,除了C的类型转换运算符type,指针引用运算符*ptr和结构成员选择符,其他C的运算符几乎完全出现在Perl里,Perl新增了几个新运算符,比如在字符处理方面.
Perl到目前支持的算数运算符有一些几种:
+ 加法运算符
- 减法运算符
* 乘运算符
/ 除运算符(只对浮点数运算)
% 取模运算符(只对整数运算)
下面给出Perl算数运算的一些实例:
$x=2.5;
$y=3;
print ($x+2*$y);
print (7/$y);
print int(7/$y);
print (7%$y);
print (7.5%$y);
Perl还支持递增和递减运算符:
++ 递加
-- 递减
Perl新增了乘方运算符:**,请看下面的例子:
$x=2**3; #2的3次方
$y=2**0.5; #2的平方根
$z=-2**-3; #结果是:-0.125
2.2 位运算符
位运算符对二进制表达式的整数形式进行处理,运算结果为整数.如果位运算符的操作数是字符串或分数,Perl首先把它们转换成整数,并用32位长整数形式表示它们.Perl支持所有的C语言运算符:
| 位或运算符
& 位与运算符
. 位非运算符
<< 位左移运算符>> 位右移运算符
有关位运算符的详细内容,请参看C语言有关的内容,这里我们就不多讲了,只举几个例子:
$x=5;
$y=3;
print $x | $y; #结果是7(二进制表示:111)
print $x & $y; #结果是1(二进制表示:001)
print $x << 2; #结果是20(二进制表示:10100) print $x>> 1; #结果是2(二进制表示:10)
2.3 比较运算符
比较运算符的功能是比较两个操作数的值.Perl在进行比较运算前,会先将字符操作数转换为数字.Perl用专门的字符串比较运算符对纯字符进行表运算.
运算符 等价字符串 含义
==
!=
>
<
>=
<=
<=>
eq
ne
gt
lt
ge
le
cmp
等于
不等于
大于
小于
大于等于
小于等于
不等于(结果带符号)
2.4 逻辑运算符 逻辑运算符测试布尔表达式的值,其结果为真或假.Perl认为逻辑运算符的每个操作数都为布尔值(即真或假).Perl的逻辑运算符包括:
|| 逻辑或运算符;
&& 逻辑与运算符.
Perl按从左到右的顺序计算逻辑表达式.当逻辑或运算符的一个操作数为真,或者当逻辑与运算符的一个操作数为假时,Perl将终止逻辑表达式的计算.Perl利用这种短回路计值快速计算表达式的值.因此,这两个运算符也叫短回路AND和短回路OR.
除了以上两个运算符,还有以下三种逻辑运算符:
! 负运算符
?: 条件运算符
, 顺序计值符
运算符!否定操作数的布尔值,相当于逻辑非.?:条件运算符,有3个操作数,表达形式为:
condition?true-result:false-result
下面的语句通过?:运算符,实现访问权限的区分:
$access=($user eq '流云'?'root':'guest');
顺序运算符(,)从严格意义上讲并不是逻辑运算符,因为它并不检查操作数的真假.Perl从左到右的计算逗号运算符,并返回最右边的操作数,都好运算符是从C延续出来的,具体使用可以参考C里的用法,这里我就不累述了.
2.5 字符运算符
由于Perl本身是为文本处理开发的.因此,它增加许多新的字符串运算符.Perl的字符串运算符包括:
. 字符连接运算符
x 字符串复制运算符
=~ 将一个变量绑定到模式匹配
!~ 将一个变量绑定到模式匹配,取非
前两个运算符比较简单.现在看看例子:
print 'C'.'a'.'l'x2; #输出结果将是: Call;
后两个运算符主要用于模式匹配,以后将会有关于模式匹配的具体讲解,这里就不多说了,我们来看看它们的例子,以了解它们的作用:
$text='今天下雨了';
print ($text=~/下雨/)?'今天下雨了':'今天没下雨';
我们看到的例子可以发现是否变量中是否包含我们所需要的字符串.
2.6 赋值运算符
赋值运算符和C语言的赋值运算符差不多,以下是各种赋值运算符:
= += -= *= /= %= |= &=
^= ~= <<=>>= **== .= x=
2.7 Lvalue
在Perl和C语言中,lvalue表示赋值运算符左边的实体.也就是说,lvalue与变量一样,可以给它分配值.例如在Perl命令文件中不能向字符串赋值,如"Bob"=32这个语句就是错误的!因为"Bob"不是一个lvalue,但是如果对$Bob赋值,如$Bob=32,这个语句就是正确的!因为变量$Bob是一个lvalue.
在Perl中,任何有意义的lvalue只能表示一个实体.例如下面的第一个语句列出了表的值(就是数组的值,只不过说法不一样罢了),@color就是一个lvalue,第二个语句中,将表的值赋值给3个标量变量,3个变量就是lvalue:
@color=($r,$g,$b);
($r,$g,$b)=@color;
Perl的赋值运算符对表进行处理时,可以不对整个表进行处理,而只针对表的某一个或者几个元素进行赋值:
@times[2,5,9]=(20,40,10);
下面的语句把表的前2个值赋给两个标量,其余部分赋给另一个表:
($arg1,$arg2,@reset)=@ARGV;
2.8 表运算符
Perl包括以下一些表运算符,而C没有:
, 表构造符
.. 范围运算符
x 表复制运算符
前面我们在介绍"标量与数组变量"时,已经设计到了构造符(我认为叫分隔符,更容易理解些)范围运算符我们在用来创建数组下标范围时,也用到过!不过,请注意它的功能还远不止这个,它还可以用来作为返回从左边操作数到右边操作数之间顺序整数的范围(包括左右两边的操作数).命令文件通常同时利用范围运算符创造一个连续整数表:
@digits=0..9;
这样我们就创造了一个表,其值为(0,1,2,3,4,5,6,7,8,9)
表复制运算符是一个非常有趣的东东,我们来看一个例子:
@copy_3=(1,2,3)x3;
这个表有9元素,其值为(1,2,3,1,2,3,1,2,3)怎么样?很方便吧!
2.9 文件运算符
Perl大大扩展了文件处理运算符.Perl至少有27个运算符在不打开文件的情况下,能够测试文件的信息,但是很不幸,由于Perl在最初是UNIX的工具,所以绝大多数的运算符在我们流行的平台上:WIN9X/NT系统无法使用.但万幸的是不是全部还有4个运算符绝对可用,而且功能不错哦!一下就是那4个运算符:
-d 测试文件是不是一个目录;
-e 测试文件是否存在;
-s 测试文件的大小;
-w 测试文件是否是可写的;
前两个运算符返回的是布尔值(即真或假),第3个运算符返回文件的大小(以字节作为返回方式).下面是
使用方法:
if(-e 'perl.exe')
{
print 'File size is:'-s'perl.exe';
}
else
{
print 'Can/'t find perl.exe/n';
}
(-w 'SomeFile')||die "Cannot write to SomeFile/n";