PERL 引用与解引用
2015-11-23 22:05
246 查看
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"};
$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"};
相关文章推荐
- 自定义导航控制器
- Bmob文档阅读2-数据及其操作
- JAVA三星题之hangman
- 对plsql一些简单的设置,提高使用的效率
- Android之支付宝设计与开发
- 修改Hadoop源码的搜索技巧
- Codeforces 599B Spongebob and Joke 【水题】
- Cloud Design Pattern - Sharding Pattern(分片模式) [上篇]
- c++类模板之间友元函数调用
- 多线程 同步synchronized、通信wait、notify
- Codeforces 599A Patrick and Shopping 【水题】
- css:appearance:none;
- STM32之SysTick学习
- 机器学习——边角料
- Java中获取键盘输入值的三种方法
- 网站开发进阶(二十)JS中window.alert()与alert()的区别
- 初识HtmlParser
- 网站开发进阶(二十)JS中window.alert()与alert()的区别
- Triangle
- LeetCode OJ:Regular Expression Matching(正则表达式匹配)