本文和大家重点讨论一下Perl引用中Perl直接引用的概念,Perl中的Perl引用分为Perl直接引用和符号Perl引用,本文只针对Perl直接引用做一下介绍,希望本文介绍对你有所帮助。

创新互联建站是一家专注于成都网站制作、做网站与策划设计,桑日网站建设哪家好?创新互联建站做网站,专注于网站建设10年,网设计领域的专业建站公司;建站业务涵盖:桑日等地区。桑日做网站价格咨询:13518219792
Perl直接引用
Perl中的Perl引用分为Perl直接引用和符号Perl引用,本文只针对Perl直接引用,至于符号Perl引用在以后的文章中会给出解释。
1、一般的标量Perl引用,如:
- subadd{
 - my($a,$b)=@_;
 - $$a++;
 - $$b++;
 - }
 - $a=1;
 - $b=2;
 - add(\$a,\$b);
 - print"$a,$b\n";
 
输出:2,3。
 说明:取变量的Perl引用可以用“\”符号。解Perl引用用“$”符号。
2、数组的Perl引用
数组的Perl引用和标量的Perl引用一样,在数组名前面加“\”,只是在解Perl引用的时候,使用@符号。如:
 @abc=(1,2,3);
 $ref=\@abc;
 print“@$ref\n”;输出1,2,3。
 print“@$ref[0]\n”;输出1。
 对数组的Perl引用主要用在解决向函数传递若干个数组的问题。在Perl中,如果向函数传递若干个数组,则他们会将这些数组展开到@_数组中,并不能通过@_这个数组来区分传递过来的参数。
 如:
- subadd{
 - my(@ref1,@ref2)=@_;
 - print(“ref1:@ref1\n”);
 - print(“ref2:@ref2\n”);
 - }
 - @a=(1,2,3);
 - @b=(1,2,3);
 - @ret=add(@a,@b);
 
实际输出的是:ref1:123123
ref2:
 可以看到,在子函数add中,并没有区分传递过来的两个参数。那么如何向函数传递多个数组或哈希表呢?
 解决的办法是使用数组Perl引用。如下这个例子说明了如何实现:
- subadd{
 - my@result;
 - my($ref1,$ref2)=@_;
 - while(@$ref1&&@$ref2){
 - unshift@result,pop(@{$ref1})+pop(@{$ref2});
 - }
 - return@result;
 - }
 - @a=(1,2,3);
 - @b=(1,2,3);
 - @ret=add(\@a,\@b);
 - print"@ret\n";
 
输出:246 #p#
3、对哈希表的Perl引用
和数组类似,但是当解Perl引用时要使用$符号,如:
 %hash=(abc=>123,def=>456);
 $ref=\%hash;
 print"%$ref\n";输出:%HASH(0x83179b4)
 print"$$ref{abc}\n";输出:123
4、表的Perl引用
创建表的Perl引用将会把表中的***一个值作为产生的标量:
 $reflist=\($a,$b,$c);
 print$$reflist."\n";#输出$c的值。
 $reflist=\(1,2...30,40);
 print$$reflist."\n"#输出40
5、创建匿名数组的Perl引用
$arrayreference=[1,2,3];
 print$$arrayreference[0];#输出1
 print$arrayreference->[0];#输出1可以用箭头解Perl引用
当用pop从数组中取值时,数组的***个元素会被弹出,但是如果用pop用于匿名数组时,可以实现取值而不影响原有数组,如:
 @a=(1,2,3);
 $s=pop@{[@a]};#perl作为快来计算@{},而快在计算时将创建对匿名数组的Perl引用。
 print“@a\n”;#输出123
当反Perl引用数组Perl引用时,该结果将插入到字符串中,如:想实现输出uc函数的返回结果:
 print"uc(abc)\n";#输出uc(abc),并不能将abc转换成大写
 print"@{[uc(abc)]}\n"#输出ABC,通过数组Perl引用实现大写转换。
 可以通过$#$的方式取匿名数组的长度:
 $a=[1,2,3,4];
 print"$#$a\n";#输出3,(***一个元素的下标)
6、创建匿名哈希表的Perl引用
如:
 $hashreference={Name=>Sylvster,Gender=>male};
 print$hashreference->{"Name"};#输出Sylvester,等价于:$$hashreference{Name};
 如果需要用each遍历哈希表,则:
 while(($key,$value)=each(%$hashreference)){}
7、用匿名哈希表模仿用户自定义数据类型
subPoint{
 ($x,$y)=@_;
 return{
 x=>$x,
 y=>$y
 };
 }
 当使用Point类型时,可以这样做:
 $point=Point(10,20);
 print"x:$point->{x},y:$point->{y}\n";
8、在perl中创建***范围闭包
例如:
- subPoint{
 - my$string1=shift;
 - returnsub{
 - my$string2=shift;
 - print("$string1,$string2\n");
 - };
 - }
 - $point=Point("Hello");
 - &$point("World");
 - &$point("guys");
 
Point函数返回一个对匿名子函数的Perl引用,变量string1被***的保存在了函数中,每次调用&$point,string1的值没有改变,都是“Hello”。
【编辑推荐】
Copyright © 2009-2022 www.wtcwzsj.com 青羊区广皓图文设计工作室(个体工商户) 版权所有 蜀ICP备19037934号