PERL编程24学时教程——13 引用与结构.pdf
《PERL编程24学时教程——13 引用与结构.pdf》由会员分享,可在线阅读,更多相关《PERL编程24学时教程——13 引用与结构.pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、下载第1 3学时引用与结构如果P e r l是你使用的第一个编程语言,那么本学时将会使你感到颇有兴趣。在大多数编程语言中,你会发现一个概念,即一组数据实际上可以是对另一组数据的引用。有时这些引用称为指针(在p a s c a l或C语言中),有时这种技术称为间接引用(在汇编语言中),而有些语言则根本没有指针的概念(在 B A S I C或J a v a中)。如果你以前从未使用过引用、指针或间接引用等概念,那么可能必须多次阅读本学时讲解的某些部分的内容,否则会感到混淆不清。P e r l也拥有这些特殊类型的值,不过在 P e r l中,它们都称为引用。在 P e r l中,引用可以用于许多目的,
2、但在本学时中,你要学习的是如何使用引用来调用带有多个参数的复杂函数和如何创建复杂的数据类型,如列表的列表。所谓引用,它非常类似老式图书馆中的卡片目录。目录中的每个索引卡指的是图书馆中的一本书。卡片可以指明这本书是什么类型的书(比如小说、非小说、参考书等),并指明这本书放在什么位置。有些卡片目录可能配有对同一本书的若干个引用,它们是不同种类的引用,并且甚至可以参见该目录中的其他卡片。P e r l的引用类似卡片目录,可以指向各组数据。引用能够知道它指向的是何种类别的数据(如标量、数组或哈希),也知道这些数据在什么地方。引用可以被拷贝,但不改变原始数据的任何东西。对于同一组数据,可以进行多次引用。
3、实际上一个引用可以指向其他的引用。请牢记下面这些要点,慢慢阅读下面几页内容,并且在我们介绍有关的问题时保持清醒的头脑:引用的基本概念。引用的常见结构。运用所有这些概念而建立的一个简要代码例子。13.1 引用的基本概念使用赋值运算符,可以创建和赋值一个普通的标量变量,如下所示:在这个代码段建立后,可以创建一个称为$a的标量变量,它包含字符串“S t o n e s”。到现在为止,一切都很正常。这时,在计算机中的某个地方有一个标为$a的位置,它包含了该字符串,如下图所示:如果将标量$b赋予$a,比如$a=$b,那么会产生该数据的两个拷贝,它们使用两个不同的名字,如下图所示:如果你想要两个独立的数据
4、拷贝,那么拥有两个拷贝是很好的。但是,如果想让$a和$b都引用同一组数据,而不是引用一个数据拷贝,那么必须创建一个引用。所谓引用,它只是指向一组数据的指针,并不包含实际数据的本身。该引用通常存放在另一个标量变量中。若要创建对某个既定变量的引用,可以在该变量的前面加上一个反斜杠。例如,若要创建称为$r e f的对$a的引用,只需要像下面这样将引用赋予$r e f即可:这个赋值创建了类似下面这样的条件:$r e f并不包含用于它自己的任何数据,它只是对$a的一个引用。变量$a根本没有改变,它仍然可以照常被赋值($a=“F o o”)或显示(print$a)。变量$r e f现在包含对$a的引用。不
5、能简单地对$r e f进行操作,因为它里边没有通常的标量值。实际上,如果输出$r e f,就会显示类似S C A L A R(0 x 0 0 0 0)的信息。若要通过$r e f获得$a中的值,必须间接引用$r e f。间接引用可以被视为上面的方块图中按箭头方向的引用。若要通过引用$r e f来输出$a的值,你可以像下面这样使用另一个$:在上面的代码段中,$r e f当然包含了引用。增加的一个$告诉P e r l,$r e f中的引用指的是一个标量值。$r e f引用的标量值被取出并输出。也可以通过引用来修改原始值,这是你对数据拷贝所不能进行的操作。下面这个代码用于修改$a中的原始值:这项修改
6、形成了类似下面这样的引用关系:如果你使用$r e f而不是$r e f那么存放在$r e f中的引用将被撤消并被实际值取代,如下所示:上面这个代码段运行后,$r e f不再包含一个引用,它只是一个标量。你可以像任何其他标量值那样,给引用赋值:得到的结果如下:上面的代码段运行后,$o r e f和$n r e f均可用于获取值“G a n d a l f”。也可以存放对某个引用的引用,如下所示:148使用第二部分高 级 特 性下载在这个例子中,引用链接类似下面的形式:如果使用$b r e f 2来输出书名,那么该引用将是$b r e f 2,如果使用$b r e f,则该引用是$b r e f。
7、请注意,$b r e f 2多了一个美元符号,它需要增加一层间接引用,才能获得原始值。13.1.1 对数组的引用也可以创建对数组和哈希结构的引用。可以像创建对标量的引用那样,使用反斜杠来创建对数组和哈希结构的引用:现在标量变量$a r e f包含了对整个数组 a r r的引用。直观地说,它类似下面的形式:若要使用引用$a r e f来访问 a r r的各个部分,你可以使用下列代码之一:$a r e f 0 a r r的第一个元素$a r e f 2,3 a r r的一个片$a r e f a r r的整个数组为了清楚起见,可以使用花括号将引用与涉及数组的各个部分隔开,如下所示:$a r e f
8、 0 与$a r e f 0 相同$a r e f 2,3 与$a r e f 2,3 相同$a r e f与$a r e f 相同例如,若要使用数组引用$a r e f,以便输出 a r r的所有元素,可以使用下面这个代码:13.1.2 对哈希结构的引用若要创建对哈希结构的引用,可以使用反斜杠,就像创建标量和数组的引用那样:上面这个代码段用于创建对哈希结构%h a s h的引用,并将它存放在$h r e f中。这个代码段创建的引用结构类似下面的形式:若要使用对哈希的引用%h r e f来访问%h a s h的各个部分,可以使用下面这些代码例子:$h r e f k e y 访问%h a s
9、h中的一个关键字,也可以是$h r e f k e y%$h r e f访问整个哈希结构,也可以是%$h r e f 若要迭代通过该哈希结构,输出所有的值,可以使用下面这个代码:第13学时 引用与结构使用149关键字数据数据数据数据关键字 关键字 关键字数据 数据 数据 数据 数据下载13.1.3 作为参数的引用由于整个数组或哈希结构均可被引用,并且该引用可以存放在一个标量中,因此,借助这些引用,你可以调用带有多个数组或哈希结构的函数。你可能还记得第8学时中我们讲过,下面这种代码段是不能运行的:这个代码不能运行,因为 g e t a r r a y s(f r u i t,v e g g i
10、e s)将两个数组压缩到单个数组 _中。在g e t a r r a y s()函数中,将 a和 b赋予 _,会导致现在存放在 _中的 f r u i t s和 v e g e t a b l e s的所有元素都被赋予 a。当所有数组挤入 _之后,就没有办法知道一个数组在何时结束和下一个数组在何时开始。只有一个很大的统一的列表。这就是引用可以发挥作用的地方。你不必将整个数组传递给 g e t a r r a y s,只要传递对这些数组的引用,就能够很好地达到你的目的:函数g e t a r r a y s()总是接收两个值,即两个引用,无论这些引用指向的数组有多长。这时,$f r u i t
11、_ r e f和$v e g _ r e f可以用来显示或编辑数据,如下所示:当你将对标量、数组或哈希结构的引用作为参数传递给函数时,有几个问题必须记住。当你传递引用时,函数能够对引用指向的原始数据进行操作。请看下面这些例子:150使用第二部分高 级 特 性下载在左边的例子中,当按正常情况传递哈希结构时,_取得原始哈希结构%h a s h中每个关键字值对的各个值。在子例程 c h a n g e h a s h()中,现在放入 _中的哈希结构的各个元素被拷贝到称为%l o c a l _ h a s h的新哈希结构中。哈希%l o c a l _ h a s h被修改,该子例程返回。当子例程返
12、回后,%l o c a l _ h a s h就被撤消,而程序的主要部分中的%h a s h则保持不变。在右边这个例子中,对%h a s h的引用通过 _被传递到子例程c h a n g e h a s h()中。该引用被拷贝到标量$h r e f中,它仍然指原始哈希%h a s h。在子例程中,$h r e f指向的哈希结构被修改,子例程返回。c h a n g e h a s h()返回后,原始哈希结构%h a s h将包含新关键字b e a r。当数组 _用于传递子例程参数时,它是个引用的数组。修改 _数组的元素就会改变传递到函数中的原始值。修改传递给子例程的参数,通常被认为是不慎重的一
13、种做法。如果你想让子例程修改传递给它们的参数,那么应该传递对子例程的引用。这种操作方法更加清楚。当传递一个引用时,可以认为原始值是可以修改的。13.1.4 创建各种结构创建对数组和哈希结构的引用,可以用来与子例程之间来回传递这些结构,并且可以用来创建下面我们很快就要介绍的一些复杂结构。不过你应该知道,当你创建了对哈希结构或数组的引用后,就不再需要原始哈希结构或数组。只要对哈希结构或数组的引用存在,即使原始数据不再存在,P e r l仍然保留着哈希结构和数组的各个元素。在下面的代码段中,代码块中创建了一个哈希结构%h a s h,并且这个哈希结构是该代码块的专用结构:在这个代码块中,标量$h r
14、 e f被赋予对%h a s h的引用。当该代码块存在时,即使%h a s h已经消失,$h r e f中的引用仍然有效(因为%h a s h是代码块的专用结构)。当结构本身已经超出作用域之后,对该结构的引用仍然可以存在,$h r e f引用的哈希结构仍然可以修改。如果你观察上面这个代码块,就会发现,它的唯一目的是创建对哈希结构的引用。P e r l提供了一个机制,可以用来创建这样的引用,而不必使用中间的哈希结构%h a s h。这个机制称为匿名存储。下面这个例子创建了一个对匿名哈希结构的引用,并把它存储在$a h r e f中:花括号()将哈希结构括起来,返回对它的引用,但实际上并没有创建新
15、的变量。你第13学时 引用与结构使用151下载可以使用前面的“对哈希结构的引用”这一节中介绍的所有方法,对匿名哈希结构进行操作。也可以使用方括号()创建匿名数组。同样,也可以使用前面的“对数组的引用”这一节中介绍的方法对数组的引用进行操作。当引用的变量本身超出作用域时(如果它是个专用变量),那么该引用指向的数据将全部消失,如下所示:如果use strict正在运行,那么上面这个代码段甚至不进行编译。P e r l将$r e f的最后一个实例视为全局变量,这是不允许的。即使没有use strict,P e r l的-w警告特性也会输出一个undefined value(未定义的值)消息。这些匿名
16、哈希结构和匿名数组可以组合成某些结构形式,我们将在下一节中介绍这些结构。每个哈希结构和数组的引用代表一个标量值,并且由于它是单个标量值,因此可以存放在其他数组和哈希结构中,如下所示:13.2 结构的配置方法下面各节将介绍列表和哈希结构的一些常用结构配置方法。13.2.1 一个例子:列表中的列表在P e r l中,列表中的列表常常用来代表一种称为二维数组的结构。也就是说,标准数组是个值的线性列表,如下所示:二维数组类似一个值的表格,里面的每个元素按照轴上的一个点来进行编址。索引的第一部分表示行号(从0开始),第二部分是列号,请看下图:152使用第二部分高 级 特 性下载值1数据数据数据数据数据数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PERL编程24学时教程13 引用与结构 PERL 编程 24 学时 教程 13 引用 结构
限制150内