[Perl] perl的引用和数据结构

May 14th, 2009

转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]

本文链接: http://www.php-oa.com/2009/05/14/perl_ref.html

自己写程序真是菜,到现在才完完全全理解了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}};
 

 @$pointer来访问数组中的元素.形式@$pointer的意义为“取出$pointer中的地址值当作数组使用”

Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
No comments yet.