PERL 语言中的引用类似于C/C++中的指针。 标量(scalar),列表(list),哈希(hash),函数(sub),文件句柄(handle)都可以使用引用来标记。引用本身又是一个标量。
$scal_ref = \$scal; 标量引用
$arr_ref = \@arr; 列表引用
$hash_ref = \%hashe; 哈希引用
首先 为什么需要引用,或者说什么时候要用引用。
(1),列表和哈希的元素只能接受标量,如果使用列表或者哈希构造多层级复杂数据结构,则列表或者哈希的元素只能存储哈希或者列表的引用,如开始所说引用本身是一个标量。
(2), 函数的参数只能传递标量。 这一点跟C++也是类似,C++的数组作为参数,实际上传递的是指针。
列表和哈希的元素只能是标量。也就是哈希和列表的引用。比如下面的例子。
@array_e = (0,1,2);
$hash_e = {};
$arr_ref = \@array_e;
$hash_e{'a'} = @array_e; #运行错误。
$hash_e{'a'} = $arr_ref; #运行正常,列表也具有同样限制,即哈希或者列表的元素只能是标量。
$scal = 10;
@arr = (1,2,3);
%hashe = ("aa"=>"aa", "bb"=>"bb","cc"=>"cc");
下面我们主要讨论标量,列表,和哈希的解引用的方法。
第一种解引用解引用的方法:用引用替代原来的变量名。如果原来的标量名为scal 则用$scal_ref 替代原来的变量名。
$scal_ref = \$scal;
$arr_ref = \@arr;
$hash_ref = \%hashe;
print $$scal_ref;
print @$arr_ref;
print %$hash_ref;
print $$arr_ref[0];
print $$hash_ref{"aa"};
第二种解引用解引用的方法:用{引用}替代原来的变量名。如果原来的标量名为scal 则用{$scal_ref }替代原来的变量名。
print ${$scal_ref};
print @{$arr_ref};
print %{$hash_ref};
print ${$arr_ref[0]};
print ${$hash_ref[1]};
print $arr_ref->[0]
print $hash_ref->{"aa"};