===============================
自己写程序真是菜,到现在才完完全全理解了perl的引用下面的笔记,先发引用
每个人都需要复合的数据结构,在Perl中我们的办法是通过'引用'来实现。这里有四个重要的操作'引用'的规则:两个方法用于创建'引用',另外两个用于使用'引用'。 一旦掌握了这些规则,你可以用'引用'来处理很多重要的事情。
创建引用
方法1(\大法)
$aref = \@array; #$aref保存着指向@array的引用
$href = \@hash; #$href保存着指向%hash的引用
方法2(括号大法)
[ITEMS] 创建一个新的匿名数组,并返回一个数组的引用
{ITEMS} 创建一个新的匿名哈希,并返回一个哈希的引用
$aref = [ 1, "foo", undef, 13 ]; # $aref 保存了这个数组的'引用'
$href = { APR =>; 4, AUG =>; 8 }; # $href 保存了这个哈希的'引用'
分别和总结
# 这里: $aref = [ 1, 2, 3 ]; 和后面一样: @array = (1, 2, 3); $aref = \@array;
前面一种方法是后面两行的缩写,除了第一种方法没有创建一个多余的数组变量@array。
如果你只是编写符号 [], 你将得到一个新的、空匿名数组。如果你使用符号 {},就能得到一个新的、空匿名哈希。
使用引用
方法1(简单,不容易错反正给原来用数组或哈希的地方替换就好了,在输出时也可以)
始终使用一个有大括号的数组'引用',来替换一个数组的名字,如@{$aref}代替@array.
数组
对数组的操作 对引用操作
@a @{$aref} 一个数组
reverse @a reverse @{$aref} 对一个数组做倒序排序
$a[3] ${$aref}[3] 数组中的一个成员
$a[3] = 17; ${$aref}[3] = 17 对一个成员赋值
哈希的'引用'和数组的'引用'完全一样
对h的操作 对引用的操作
%h %{$href} 一个哈希
keys %h keys %{$href} 从哈希中将键取出来
$h{'red'} ${$href}{'red'} 哈希中的一个成员
$h{'red'} = 17 ${$href}{'red'} = 17 对一个成员赋值
方法2(上面的方法好用,但不方便读,下面会方便些)
${$aref}[3] 可以写成 $aref->[3]. #注$aref->[3]不等同$aref[3],前面的$aref->表示的其实是@aref,后面只是一个标量
${$href}{red} 可以写成 $href->{red}. #同上
箭头符号规则 在两个下标之间的箭头是可选的。 $a[1][2]来代替$a[1]->[2]
使用方法1 中,当大括号里面是一个象$aref这样的标量变量时,你可以省略掉这个大括号。例如, @$aref 和@{$aref}是一样.
perl中容易出问题和要注意的地方
下面的操作不会copy '引用'指向的数组:
$aref2 = $aref1;
你将得到两个'引用',它们都指向同一个数组。如果你修改了$aref1->;[23]的值,那么你查看变量$aref2->;[23]时,它也相应地变了。
所以,如果你要copy这个数组,你需要这样
$aref2 = [@{$aref1}];
使用符号 [...] 来创建一个新的匿名数组, 而且这个新的数组的'引用'被赋值给了$aref2 。 这个新的数组用'引用'$aref1所指向的数组的内容来初始化。
同样的,要copy一个匿名哈希,你需要这样
$href2 = {%{$href1}};
没有评论:
发表评论
写下你的意见和问题,一起进步。谢谢