perl的数据类型

来源:互联网 发布:富士触摸屏软件 编辑:程序博客网 时间:2024/06/03 20:35

概括、perl有两种基本数据类型,标量类型和复数类型。

标量类型

                |-----双精度浮点数

                |-----字符串类型

                |-----引用类型

复数类型

                |-----数组

                |-----散列表

函数类型(函数可以看成是具有执行属性的对象)

符号表类型

包类型

一、双精度浮点数

perl中所有的数值都是双精度浮点数类型,避免了类型转换之苦。

二、字符串类型

单引号字符串和双引号字符串。单引号字符串只有单引号和转义字符需要进行转义其他原样输出。

双精度浮点数和字符串之间可以根据上下文进行自动的转换。

print "123".456;#123456print "123"+456;#579print "\ngood";#输出换行符print '\ngood';#原样输出print "abc" x 3;#abcabcabc,注意不是*$num=100;print "a $num b";#a100b,字符串内插

三、数组类型

@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;

四、散列表类型

%hash1=("first"=>1,"second"=>2,"third"=>3);#只能用字符串做keyprint keys(%hash1);#key的数组print values(%hash1);#值的数组$hash1{"fourth"}=4;#添加元素delete($hash1{"second"});#删除元素foreach(keys(%hash1)) {    print($hash1{$_});}print "exists" if(exists($hash1{"third"}));#判断是否存在

五、引用类型

可以把引用类型想象成c语言中的指针,perl中的引用类型用来构成复杂的数据结构,还有传递引用可以避免大量的数据拷贝。

#下面是标量的引用$refer1="string";#refer1存储的是"string"的句柄$refer2=\"string";#$refer2存储的是"string"的句柄#标量的类型似乎意义不大print $refer1;print $refer2;#数组的引用@arr1=(1,2,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,"second"=>2,"third"=>3);push(@arr2,\%hash1);#同理 push(@arr2,{"first"=>1,"second"=>2,"third"=>3})print $arr2[3]->{"second"};#函数的引用sub func {    print "hello world!";}$func1=\&func;# &表示func是一个函数句柄&$func1;

六、符号表类型

每个包中都有一个全局的符号表,不同数据类型的变量可以拥有相同的变量名称,因为它们属于不同的命名空间。

$num1=100;*num2=*num1;#num2和num1此时公用一个符号表,也就是说num2是num1的别名print $num2;#100

七、函数

#$sum=0;sub testfunc {#无需指定参数列表    my ($sum);#局部变量    foreach(@_) {#@_存储参数,这里是引用的另一个作用,如果没有引用,穿进来的的多个数组或者hash都被转换成了数组,悲剧。        $sum+=$_;    }    $sum;#最后一句的执行值就是返回值    #return $sum;也可以}print testfunc(1,2,3)

闭包

sub return_bibao {    my ($num1);    $num1=10;    return sub {    print $num1;    $num1++;};}$bibao1=return_bibao();&$bibao1();#10&$bibao1();#11&$bibao1();#12