创建复杂系统的编程语言的两个特点:
1. 匿名数据结构,即动态为数据分配内存,而无需变量名.(如C的malloc)
2. 可指向任何数据结构,无论静态还是动态分配.(如C中的指针)
Perl完全实现了这两个要求,其第二个特点是采用引用(Refrence).
对已有变量的引用, 在变量名前添加/来创建对它的引用:
1. 对于标量变量引用
$a="Hello";
@array=(10.20);
%hash=("iPod"=>"apple","core"=>"intel");
$ra=/$a;
$rarray=/@array;
$rhash=/%hash;
2. 对于常量的引用
$ra=/10;
$rs=/"Hello";
3.对于数组和hash单个元素的引用
$r_array_element=/$array[0];
$r_hash_element=/$hash{"iPod"};
引用本身就是一种标量变量,可被使用如print
print $ra;
结果包含两部分,第一部分表明它所引用的值的数据类型,第二部分表明其内存地址
通过引用来间接访问(类似于c中的*P,根据指向的内存地址取值)
根据$r所引用的数据类型(标量变量,数组,散列hash),分别使用$$r,@$r,%$r来间接访问所引用的变量(整体)。(明显的类型匹配)
对标量变量:
$a=2;
$ra=/$a;
print $$ra; # 同print $a;
对数组:
$rarray=/@array;
push (@$rarray,"Hello") #同push(@array,"Hello")
print $$rarray[1]; #单元素的存取 同print $array[1]
对散列hash:
$rhash=/%hash;
print $$rhash{"key1"}; #单元素的存取 同print $hash{"key1"}
关于优先级的谈论
$$rarray[i];
从右到左递减
[i]>$rarray>$
也就是${$rarray}[i];
使用引用箭头简易存取数组和散列表元素
$rarray=/@array;
print $rarray->[1]; #同print $rarray[1]; 打印数组的第二个元素,只不过此处使用了引用
同理 散列表有:
print $rhash->{"Key1"};
引用的使用
1. 向子例程sub里传递数组和散列表(引用)
@array1=(1,2,3);
@array2=(4,5,6);
AddArrays(/@array1,/@array2);
print @array1;
sub AddArrays{
my ($rarray1,$rarray2)=@_;
my $length2=@$rarray2; #标量上下文返回数组元素个数
for($i=0;$i<$length;$i++){
$$rarray1[$i]+=$$rarray2[$i]; #或者$rarray->[$i]+=$rarray->[$i];
}
}
2. 匿名存储的引用
a)匿名数组的引用,使用方括号而非圆括号
$ra=[] #创建一个空的匿名数组,并返回对它的引用
$ra=[1,2,3]; #创建一个初始化的匿名数组,并返回对它得引用
b)匿名散列表的引用,使用花括号而非方括号
$ra={} #创建一个空的匿名散列,并返回对它的引用
$ra={"a",1,"b",2}; #创建一个初始化的匿名散列表,并返回对它得引用
********在Perl中my操作符定义的变量是局部变量
多重引用即引用的引用在Perl中是可以接受的 如
$ra=/$a;
$rra=/$ra;
$rrra=/$rra;
print $a;
print $$ra;
print $$$rra;
print $$$$rrra; #得到的都是同样的输出结果
使用引用实现复杂的数据结构
数组和散列表的元素不能为数组或者散列,因为其只能是标量变量类型,但可以为引用,而引用可以指向数组或者散列,从而实现复杂的数据结构。
此处使用黑豹书原例:
%susan={"Name"=>"Susan","Age"=>"40"};
%john={"Name"=>"John",Age=>"18"};
%jenifer={"Name"=>"Jenifer",Age=>"16"};
$susan{"Children"}=[/%john,/%jenifer]; #还记得吗,这里使用方括号建立匿名数组返回引用
将对John和Jenifer的引用添加到Susan的以“Children”为Key的值里,建立起了母子联系实现了复杂数据结构
要输出Jenifer的Age,可以 print $susan{"Children"}->[1]->{"Age"}; So cool! I think.
更简洁的是可以省略此处的-> 即 print $susan{"Children"} [1] {"Age"};
如果这个数据关系是不存在的,如下的语句将创建上述结构关系
$susan{"Children"}->[1]->{"Age"}=18;
Perl对程序员的效率体现于此
完全的匿名实现
%susan={"Name"=>"Susan","Age"=>"40"
"Children"=>[
{"Name"=>"John",Age=>"18"},
{"Name"=>"Jenifer",Age=>"16"}
]
};
引用查询
ref函数,返回false表示非引用,否则返回引用所指向的数据类型
符号引用
$x=10;
$var="x";
$$var=30;
print $x结果为30 $$var=$x=30
****符号引用对标量变量,数组,散列表都有效
****符号引用只对全局变量有效(非my.....)