Perl直接l引用用法解析

开发 架构
Perl引用的概念你是否了解,这里和大家分享一下,Perl引用分为直接引用和符号引用,本文只针对直接引用,至于符号引用在以后的文章中会给出解释。

本文和大家重点讨论一下Perl直接Perl引用,PerlPerl引用分为直接引用和符号引用,每种Perl引用都有各自的特点和作用,这里向大家简单介绍一下Perl直接应用的概念,希望对大家学习有所帮助。

Perl直接l引用

Perl中的Perl引用分为直接引用和符号引用,本文只针对直接Perl引用,至于符号Perl引用在以后的文章中会给出解释。

1、一般的标量Perl引用,如:
 

  1. subadd{  
  2. my($a,$b)=@_;  
  3. $$a++;  
  4. $$b++;  
  5. }  
  6. $a=1;  
  7. $b=2;  
  8. add(\$a,\$b);  
  9. 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中,如果向函数传递若干个数组,则他们会将这些数组展开到@_数组中,并不能通过@_这个数组来区分传递过来的参数。
如: 

  1. subadd{  
  2. my(@ref1,@ref2)=@_;  
  3. print(“ref1:@ref1\n”);  
  4. print(“ref2:@ref2\n”);  
  5. }  
  6.  
  7. @a=(1,2,3);  
  8. @b=(1,2,3);  
  9. @ret=add(@a,@b);  
  10.  

实际输出的是:ref1:123123
ref2:
可以看到,在子函数add中,并没有区分传递过来的两个参数。那么如何向函数传递多个数组或哈希表呢?
解决的办法是使用数组Perl引用。如下这个例子说明了如何实现:
 

  1. subadd{  
  2. my@result;  
  3. my($ref1,$ref2)=@_;  
  4. while(@$ref1&&@$ref2){  
  5. unshift@result,pop(@{$ref1})+pop(@{$ref2});  
  6. }  
  7. return@result;  
  8. }  
  9.  
  10. @a=(1,2,3);  
  11. @b=(1,2,3);  
  12. @ret=add(\@a,\@b);  
  13. print"@ret\n";  
  14.  

输出:246

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引用 

  1. $arrayreference=[1,2,3];  
  2. print$$arrayreference[0];#输出1  
  3. print$arrayreference->[0];#输出1可以用箭头解Perl引用  
  4.  

 当用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中创建***范围闭包

例如: 

  1. subPoint{  
  2. my$string1=shift;  
  3. returnsub{  
  4. my$string2=shift;  
  5. print("$string1,$string2\n");  
  6. };  
  7. }  
  8. $point=Point("Hello");  
  9. &$point("World");  
  10. &$point("guys");  

Point函数返回一个对匿名子函数的Perl引用,变量string1被***的保存在了函数中,每次调用&$point,string1的值没有改变,都是“Hello”。

【编辑推荐】

  1. 经验总结 Perl的安装配置步骤
  2. Perl foreach控制结构中的控制变量
  3. Perl面向对象编程中方法的调用
  4. 揭秘Perl变量中Perl纯变量用法
  5. Perl基础 Perl复杂数据结构

 

责任编辑:佚名 来源: csdn.net
相关推荐

2010-07-20 13:53:44

Perl引用

2010-07-16 13:45:41

Perl引用

2010-07-21 13:59:59

Perl引用

2010-07-16 16:40:48

Perl引用

2010-07-13 13:49:43

Perl foreac

2010-07-16 16:56:01

Perl构造函数

2010-07-20 09:45:04

Perl继承

2010-07-19 14:13:41

Perl函数

2010-07-15 10:22:23

Perl控制结构

2010-07-16 08:47:53

Perl if语句

2010-07-20 15:02:20

Perl数组

2010-07-14 15:32:21

Perl转义字符

2010-07-16 13:10:36

Perl哈希表

2010-07-19 14:37:01

Perl进程启动函数

2010-07-15 10:47:22

Perl命令行

2010-07-15 15:54:10

Perl守护进程

2010-07-13 09:23:00

Perl变量

2010-07-26 15:17:51

Perl解析XML文件

2010-07-14 12:39:30

Prel字符串

2010-07-19 14:20:57

Perl函数
点赞
收藏

51CTO技术栈公众号