PERL 引用与解引用

来源:互联网 发布:搜狗浏览器打开淘宝卡 编辑:程序博客网 时间:2024/06/01 09:29

PERL 语言中的引用类似于C/C++中的指针。 标量(scalar),列表(list),哈希(hash),函数(sub),文件句柄(handle)都可以使用引用来标记。引用本身又是一个标量。

$scal_ref = \$scal;                       标量引用

$arr_ref = \@arr;                          列表引用

$hash_ref = \%hashe;                  哈希引用

$handle = \*STDOUT ;                 文件句柄引用
$routine = \&routine;                     函数引用

sub routine()
{
}


首先 为什么需要引用,或者说什么时候要用引用。

(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]};


第二种和第一种的区别,如果引用时从哈希或者列表中取出,则只能用第二种方法。如下列。
$h_ref = {"aa"=>[1,2,3]};
foreach my $temp (@h_ref->{"aa"}) #运行错误
foreach my $temp (@{h_ref->{"aa"})#运行正确

第三种解引用解引用的方法:只能用于于列表和哈希存取元素,而不能把劣币哦和哈希当成整体操作。

print $arr_ref->[0]

print $hash_ref->{"aa"};


数组和哈希的匿名引用定义:

$arr = [];
$arr1 =[1,2,3];

$hash={};
$hash1={'a' =>"a", "b"=>"b","c"=>"c"};




1 0