Perl中的直接引用有哪些?

Perl中的直接引用有哪些?

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”。