perl 变量

创建复杂系统的编程语言的两个特点:

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.....)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值