Perl中的直接引用

来源:互联网 发布:unity3d插件怎么用 编辑:程序博客网 时间:2024/06/12 01:43
 
Perl 中的直接引用
 
Perl中的引用分为直接引用和符号引用,本文只针对直接引用,至于符号引用在以后的文章中会给出解释。
 
1、    一般的标量引用,如:
sub add{
        my ($a,$b) = @_;
        $$a++;
        $$b++;
}
$a=1;
$b=2;
add(/$a,/$b);
print "$a,$b/n";
       输出:2,3。
       说明: 取变量的引用可以用“/”符号。解引用用“$”符号。

2、    数组的引用
数组的引用和标量的引用一样,在数组名前面加“/”,只是在解引用的时候,使用@符号。如:
   @abc = (1,2,3);
   $ref = /@abc;
   print “@$ref/n”; 
输出 1,2,3。
   print “@$ref[0]/n”; 输出 1。
对数组的引用主要用在解决向函数传递若干个数组的问题。在Perl中,如果向函数传递若干个数组,则他们会将这些数组展开到@_数组中,并不能通过@_这个数组来区分传递过来的参数。
如:
sub add{
        my (@ref1, @ref2) = @_;
      print (“ref1: @ref1/n”);
      print (“ref2: @ref2/n”);
}

@a=(1,2,3);
@b=(1,2,3);
@ret = add(@a,@b);
实际输出的是: ref1:1 2 3 1 2 3
                 ref2:
可以看到,在子函数add中,并没有区分传递过来的两个参数。那么如何向函数传递多个数组或哈希表呢?
解决的办法是使用数组引用。如下这个例子说明了如何实现:
sub add{
        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";
输出:2 4 6
 
3、对哈希表的引用
 和数组类似,但是当解引用时要使用$符号,如:
    %hash = ( abc => 123, def => 456 );
$ref = /%hash;
print "%$ref/n";    输出:%HASH(0x83179b4)
print "$$ref{abc}/n";   输出: 123
4、 表的引用
创建表的引用将会把表中的最后一个值作为产生的标量:
$reflist = /($a,$b,$c);
print $$reflist."/n";    #输出$c的值。
    $reflist = /(1,2...30,40); 
print $$reflist."/n"          #输出40
   
5、 创建匿名数组的引用
$arrayreference = [1,2,3];
print $$arrayreference[0];    #输出1
print $arrayreference->[0];   #输出1   可以用箭头解引用

当用pop从数组中取值时,数组的第一个元素会被弹出,但是如果用pop用于匿名数组时,可以实现取值而不影响原有数组,如:
@a=(1,2,3);
$s = pop @{[@a]};   #perl作为快来计算@{},而快在计算时将创建对匿名数组的引用。
print “@a/n”; #输出 1 2 3

当反引用数组引用时,该结果将插入到字符串中,如:想实现输出uc函数的返回结果:
 print "uc(abc)/n";   #输出 uc(abc), 并不能将abc转换成大写
print "@{[uc(abc)]}/n" #输出 ABC, 通过数组引用实现大写转换。
   可以通过$#$的方式取匿名数组的长度:
$a = [1,2,3,4];
print "$#$a/n";#输出3,(最后一个元素的下标)
6、 创建匿名哈希表的引用
如:
$hashreference = {Name=>Sylvster, Gender=>male};
print $hashreference->{"Name"}; #输出 Sylvester,等价于:$$hashreference{Name};
 如果需要用each遍历哈希表,则:
   while( ($key, $value) = each(%$hashreference)){}
7、 用匿名哈希表模仿用户自定义数据类型
sub Point{
        ($x,$y) = @_;
       return {
                x=>$x,
                y=>$y
        };
}
    当使用Point类型时,可以这样做:
$point=Point(10,20);
print "x:$point->{x},y:$point->{y}/n";
 
8、 在perl中创建永久范围闭包
例如:
sub Point{
        my $string1 = shift;
        return sub{
                my $string2 = shift;
                print ("$string1, $string2/n");
        };
}
$point=Point("Hello");
&$point("World");
&$point("guys");
Point函数返回一个对匿名子函数的引用,变量string1被永久的保存在了函数中,每次调用&$point,string1的值没有改变,都是“Hello”。
 
 
 
原创粉丝点击