perl语言中的变量有以下五种:
标量,指针,数组,哈希表(hash)和句柄。
一、标量
我们先来看看标量,标量是perl语言中最简单的一种数据类型。这种数据类型的变量可以是数字,字符串,浮点数,不作严格的区分。在使用时在变量的名字前面加上一个“$”,表示是标量,相当于scalar中的第一个S。
使用以下格式进行定义:
$myfirst= 123; # 数字 123
$mysecond="123"; # 字符串123
$mythird= "$myfirst,$mysecond"; # 字符串123,123
$myforth= '$myfirst,$mysecond'; # 字符串$myfirst,$mysecond
数字类型的标量可以使用0开头代表是8进制,用0x开头代表是16进制。例如:
$var1= 017; # 十进制的15
$var2= 0xf; # 十进制的15
还可以使用下面的格式:
$var3= 123_456_7; # 1234567
浮点数可以使用以下定义方式:
$var4= 3.4;
$var5= 4.3e+21;
$var6= 234E345;
perl中的字符串使用一个标量来表示,定义方式和c很像,但是在perl里面字符串不是用0来表示结束的。而且使用双引号和单引号定义的字符串是不一样的。使用双引号定义的字符串里面出现的变量名会进行替换,而且可以出现“\n\r\t”等控制字符。而用单引号定义的就不可以了使用反斜杠引导的控制命令了(当然还可以使用反斜杠引道单引号和反斜杠),文本会按照字符串原来的样子保存。
但是用单引号定义可以使用多行文本,如下所示:
$var7='这是一个使用
多行字符串文本
的例子';
$var8= '\'\\'; # 字符串'\
二、数组
在Perl中数组使用“@”引导,“@”的意义应该是相当于array中的第一个a吧(嘻嘻,猜的)。数组初始化使用()。我们可以采用如下方法初始化数组:
@var9=(1,2,3,4,5);
而当引用数组中的元素时则使用下面的格式:
$var10=$var9[1];
数组前面的引导字符变成了“$”,表示这里是引用数组中的元素。
如果使用“@”作引导字符,那么刚才的例子就会返回数组的长度。例如:
$length=@var9; # 则$length会返回数组长度也就是数组的元素个数5
三、哈希表(hash)
哈希表是一种很特别的数据结构,我在学习数据结构时见过,叫做散列(Set),在使用perl之前,我在borland C++中见过一种类似的class,也叫做Set。在JavaScript中也提供了相似的数据结构,叫做关连数组Associated Array。
哈希表用“%”引导。定义方法如下:
%var11=("hello"=>"哈罗","nihao"=>"你好");
使用方法如下:
print $var11{"hello"}; # 输出 哈罗 $var11{"nihao"}="你好";
还可以使用下面的方法定义:
%var12= ("hello","哈罗","nihao","你好");
这个方法的结果与上面的结果相同,但是我还是喜欢第一种方法,而且建议你也使用第一种方法。
四、句柄
句柄是一种特殊的数据,用来保存系统资源的指针,例如文件,目录,管道,socket等等。在最新的perl中,实际上可以不使用这种数据。句柄类型没有引导字符。一般情况下大家习惯使用大写字母来标明句柄类型。例如下面的例子打开一个文件,读出一行,然后关闭。
open(FILEHANDLE,"test.htm");
$templine=<FILEHANDLE>;
close(FILEHANDLE);
这里<>起从句柄中读出一行的作用。
五、指针
perl里面的指针分为两种类型,一种成为软指针,另一种称为硬指针。下面将主要介绍一下硬指针。在perl里面使用“\”来生成指针。如下面的例子:
$vavr13="hello";
$pointerto=\$var13;
这时$pointerto就是一个指向$var13的指针了。访问指针指向的数据可以使用下面的方法。print $$pointerto; 也就是加上一个$就可以了。perl里面的指针与c里面的不同,perl里面的指针是有引用计数的。也就是说,如果一个数据可以记住自己被几个指针引用,当没有指针引用时这个数据会自动释放内存。
来看看标量的操作符,标量可以分为两类:一类是数字,另一类是字符串。在perl中这两类数据可以相互转化,但是操作还是有区别的。
下面先介绍数字类型的操作符:
数字类型的运算操作符有一下几种:
+(加),-(减),*(乘),/(除),-(取反)。
不会的举手,好没有。
下面讲一些难的。
第一个是“%”(取余)。嗯,会C语言的可以退场。这个操作符的使用方法和“/”差不多,但是结果是除之后的余数。例如:
$a=6%5;这时$a的值为1;
$b=5%6; 这时$b的值为5。
如果在进行求余运算时不是整数,那么四舍五入后进行运算,不可以对0求余噢!
第二个是幂运算(**)。
$c=2**3; 这时$c的值为8。相信我,我写了一个程序实验过的,程序如下:
#!/user/bin/perl -w
use strict; {
my $a=2**3;
print $a;
}
还有两种我们应该知道的运算符是“++”和“--”。“++”在自身基础上面加一,“--”在自身基础上减一。这种运算在c里面经常用的。
数字的比较运算符有下面几个: “<”,“>”,“<=”,“>=”我想这几个我就不用解释了。再有一个就是“==”这个运算符用来对比两个数字是否相等。然后就是“!=”表示两个数字不等。
还有一个好玩的比较运算符是“<=>”,这个运算符当左边的数字小于右边的时返回-1,相等时返回0,当左边的大于右边的时返回1。
另外就是位操作符了,和c一摸一样。
位与:& 位或:| 位非:~ 位异或:^ 左移:$x << 1 右移:$x >> 2
注:不要将&用于负整数,因为PERL将会把它们转化为无符号数。
然后要讲一讲的是赋值操作符,最基本的赋值操作符是“=”,(废话!)然后一种是“+=”表示在自身基础上面增加。例如:
$d=3; $d+=3; 这时$d就等于6了。
相应的还有“-=”,“*=”,“/=”,“**=”,“^=”,“&=”,“|=”,“~=”。 数字的操作符大致就有这些了。
下面是关于字符串的操作符的介绍。两个字符串相加(连接)用“.”进行。例如:
$e="hello "."all";
这时$e的值为“hello all”相应的也就有“.=”运算了。
另外还有一个运算符是x,没错,就是它。用来表示……只可意会,不可言传。
$f="f"x5; 此时$f的值为"fffff",明白了吧?
字符串的比较用以下的操作符进行:
“lt”意为“小于,less than”;
“gt”意为“大于,greater than”;
“eq”意为“等于,equal”;
“le”意为“小于等于,less than or equal”;
“ge”意为“大于等于,greater or equal”;
“ne”意为“不等于, not equal”;
“cmp”意为“比较,返回 1, 0, or -1,compare”。
可以看出来字符串的操作和数字的操作是相对的。
另外对字符串可以进行“++”运算,这时将会把字符串的ascii码加一。但是"z"++却是"a","Z"++ 是"A","9"++是0,"ab99"++将会得到"ac00"。呵呵,很好玩吧?字符串是没有-,*,/等运算的。如果我们对字符串进行这些运算则表示我们要把字符串转换成数字然后进行计算。如果这个字符串是"111"还好说,如果我们强制perl把例如"aaaaa"一类的字符串进行数字运算, perl会把这些字符串转换成0。因此"aaa"--将会得到-1。很好玩是不是?呵呵,perl还有很多好玩的东西。
对标量进行操作还可以使用下面的函数。
第一个是length(),这个函数可以返回变量打印出来的长度。例如:
length(23),将会返回2;
length("hahaha"),将会返回6;
length(1)将返回1。
在perl5中length("你好"),将会返回4,听说在perl5.6中将不会。我没有实验过,不好说什么。
第二个函数是chop()。这个函数将会节掉字符串中的最后一个字符,例如:
$g="aaa";
chop($g);
这时$g中的值是"aa";同时chop会返回它所截下来的字符。试一试 $g="你好"; chop($g); 会发生什么?
第三个函数是chomp(),这个函数仅仅将字符串末尾的换行符裁掉。
第四个函数是substr()这个函数可以从一个字符串中截取一段长度的字符串并将其返回。例如:
$h="hello all";
$i=substr($h,3,5)
将会从“hello all”中截取长度为5的字符串,就是"lo al"。试一试这样呢?
$h="你们好吗?";
$i=substr($h,3,5);
第五个很有用的函数就是defined(),这个函数用来判断一个数据是否已经定义。在perl中,一个数据如果没有定义,那么他将会是一个叫做 undef的特殊值。 defined()是一个非常有用的函数。至少我经常用。有其是在判断cgi输入的时候。
数组是perl里面一种非常有用的东西。我们可以通过下面的方式定义数组:
@a=("hello","great","cipher");
@b=(1,2,3,4,5,6,7);
@b的定义方式还可以写成下面的形式:
@b=(1..7); #这种方式对于需要1到10000的初始值得数组真实太重要了。
@b=("a".."z");
也是可以的,但是我想不出来对中国人有什么用。定义一个空数组可以用下面的方式:
@c=();
访问数组通过下面的方式(下标和c语言一模一样,从0开始,basic的用户要注意了):
$b[0]=10000;
注意这里引导符变成了$不是@。通过这个变化表示这时正在访问一个单独的数据。而不是一组数据。还可以使用多个下标,但是这时就要使用@引导符了。例如:
@b[5,7,9]=(45,56,67);
这种情况下,print $b[8];将会在使用了perl -w得到一个使用未定义变量的错误,其他情况下什么都不会发生。
数组之间相互拷贝,可以用下面的方式:
@d=@c;
这样要比c语言简单多了。同c语言不同,perl的数组是可以动态改变大小的。因此我们可以追加,删除数组内的元素。追加一个元素可以使用这种方式:
@c=(@c,"hello");
perl里面有一个专门的函数用来惊醒追加操作叫做push,push的使用方法如下:
push(@c,"hello");
push(@c,("hello","halloha"));
push(@c,@a);
这里可以看到,可以给数组追加一个元素,一组元素甚至另外一个数组。另外,在perl的数组中可以放不同类型的标量。这一点在c程序员的眼中可能有点怪异,但是如 果记住perl里面的一切都是引用就可以了。或者理解成这是一个void类型的指针的数组。有了push,就一定有pop。pop就是从数组的最后取出一个元素。用法为:
pop(@a);
既然可以从数组的末尾加入元素,那么一定也可以从数组的开头加入元素。那么这个功能是由unshift函数提供的。用法为:
unshift(@c,"hello");
unshift(@c,("hello","halloha"));
unshift(@c,@a);
有了unshif就一定会有shift了。shift的功能是从数组的开头取出一个元素。用法为:
unshift( @a);
有了操作数组两端的函数那么一定也会有操作数组中间部分的函数,这个函数就是splice,splice函数有三个作用。第一个作用是向数组中间的一部分插入内容。例如:
@d=(1..9);
my @e=("a".."f");
splice(@d,2,2,@e);
将会得到12abcdef56789,注意这里是从第二个开始插入,不是从下标为2的元素开始插入的。splice的第二个功能是删除,例如在刚才的代码上面再加上:
splice(@d,2,6);
将可以得到1256789;splice的第三个功能就是删除到末尾。语法为:
splice(@d,2);
就是从第二个开始,删除到末尾。我们还应该有一个可以把整个数组合并成一个标量的函数。这个函数就是join,join有两个参数,第一个参数是合并时放在元素之间的分割符,第二个是进行操作的数组。 例如:
my @g=(1,2,3);
join(" ",@g);
将可以得到“1 2 3”,还有三个函数我们昨天已经见过了,就是undef,chop和chomp。undef(@a); 的作用是把@a的内容清空。chop(@a); 的作用是把数组内每个元素的末尾去一个字符。而chomp(@a); 的作用则是把数组内的每一个元素的末尾的换行符去掉。我们还应该介绍一个函数就是scalar,这个函数取得数组的长度。例如:
my @h=(1,2,3);
scalar(@h);
将可以得到3。但是我们经常不这么用,因为在将数组向标量转换时就会返回数组的长度,例如下面的操作就可以。
my @i=(1,2,3,4);
print @i."\n";
将会打印出4。 好了,今天就到这里吧,最后是一个概括了今天大部分内容的程序。我写的。中间会输出很多错误信息。呵呵。
#!/user/bin/perl -w
use strict;
{ $|=" ";
my @a;
@a=(1,2,3);
@a[4,6]=(23,34);
#print $a[5];
#quoted because it would cause error
my @b;
@b=("because","haul");
push(@b,"grand");
print @b;
print "\n";
push(@b,("puppy","kitty"));
print @b;
print "\n";
push(@b,@a);
print @b;
print "\n";
push(@a,@b);
print @a;
print "\n";
my @c;
@c=(1,2,3,"hello");
print @c;
print "\n";
pop(@a);
print @a;
print "\n";
my @d;
@d=(1..9);
print @d;
print "\n";
my @e=("a".."f");
splice(@d,2,2,@e);
print @d;
print "\n";
splice(@d,2,6);
print @d;
print "\n";
}
嘻嘻,程序很长,不过试着运行一下,全是上面所讲的内容的应用,加深一下你的印象吗。