Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15650
  • 博文数量: 7
  • 博客积分: 390
  • 博客等级: 一等列兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-07 00:31
文章分类

全部博文(7)

文章存档

2009年(7)

我的朋友

分类:

2009-07-28 21:07:45

创建复杂系统的编程语言的两个特点:
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 ;   #标量上下文返回数组元素个数
    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.....)
阅读(761) | 评论(0) | 转发(0) |
0

上一篇:[转载] 一篇文章,关于学习shell

下一篇:没有了

给主人留下些什么吧!~~