概括、perl有两种基本数据类型,标量类型和复数类型。
标量类型
|-----双精度浮点数
|-----字符串类型
|-----引用类型
复数类型
|-----数组
|-----散列表
符号表类型
包类型
一、双精度浮点数
perl中所有的数值都是双精度浮点数类型,避免了类型转换之苦。
二、字符串类型
单引号字符串和双引号字符串。单引号字符串只有单引号和转义字符需要进行转义其他原样输出。
双精度浮点数和字符串之间可以根据上下文进行自动的转换。
print "123".456;#123456 print "123"+456;#579 print "\ngood";#输出换行符 print '\ngood';#原样输出 print "abc" x 3;#abcabcabc,注意不是* $num=100; print "a $num b";#a100b,字符串内插@H_301_48@
三、数组类型@arr=(1,2,3); push(@arr,4);#push,pop最后一个元素 pop(@arr); shift(@arr);#shift,unshift第一个元素 unshift(@arr,1); print $arr[$#arr];#访问最后一个元素 print $arr[-1]; @arr1=@arr[0,2];#数组切片和@arr[0..2]相同 print @arr1;@H_301_48@
四、散列表类型%hash1=("first"=>1,"second"=>2,"third"=>3);#只能用字符串做key print keys(%hash1);#key的数组 print values(%hash1);#值的数组 $hash1{"fourth"}=4;#添加元素 delete($hash1{"second"});#删除元素 foreach(keys(%hash1)) { print($hash1{$_}); } print "exists" if(exists($hash1{"third"}));#判断是否存在@H_301_48@
五、引用类型可以把引用类型想象成c语言中的指针,perl中的引用类型用来构成复杂的数据结构,还有传递引用可以避免大量的数据拷贝。
#下面是标量的引用 $refer1="string";#refer1存储的是"string"的句柄 $refer2=\"string";#$refer2存储的是"string"的句柄 #标量的类型似乎意义不大 print $refer1; print $refer2; #数组的引用 @arr1=(1,3); @arr2=(\@arr1,4); print ${$arr2[0]}[0]; print $arr2[0]->[0];#上一句的简洁写法 #如果没有数组引用就不能实现链式访问,因为数组元素必须通过引用来访问。 $refer3=[4,5,6];#获得一个数组的引用,这就是数组在定义是不用[]的原因,hash同理 push(@arr2,$refer3); print $arr2[2]->[2]; #散列表的引用 %hash1=("first"=>1,"third"=>3); push(@arr2,\%hash1);#同理 push(@arr2,{"first"=>1,"third"=>3}) print $arr2[3]->{"second"}; #函数的引用 sub func { print "hello world!"; } $func1=\&func;# &表示func是一个函数句柄 &$func1;@H_301_48@
六、符号表类型每个包中都有一个全局的符号表,不同数据类型的变量可以拥有相同的变量名称,因为它们属于不同的命名空间。
$num1=100; *num2=*num1;#num2和num1此时公用一个符号表,也就是说num2是num1的别名 print $num2;#100 @H_301_48@
七、函数#$sum=0; sub testfunc {#无需指定参数列表 my ($sum);#局部变量 foreach(@_) {#@_存储参数,这里是引用的另一个作用,如果没有引用,穿进来的的多个数组或者hash都被转换成了数组,悲剧。 $sum+=$_; } $sum;#最后一句的执行值就是返回值 #return $sum;也可以 } print testfunc(1,3)@H_301_48@
闭包sub return_bibao { my ($num1); $num1=10; return sub { print $num1; $num1++; }; } $bibao1=return_bibao(); &$bibao1();#10 &$bibao1();#11 &$bibao1();#12 @H_301_48@