- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
谁需要复杂的数据结构 ?
始终伴随着 Perl 4 的一个问题是怎么样来描述一个值是列表的哈希表。 Perl 4 有哈希但是它
的值必须是标量,不能是列表。
你为什么需要一个列表的哈希结构呢?让我们来看一个简单的例子: 你有一个包含城市和国
家名称的文件,如下:
Chicago, USA
Frankfurt, Germany
Berlin, Germany
Washington, USA
Helsinki, Finland
New York, USA
你想按照下面的格式输出, 每一个国家出现一次, 然后是一个按照字母顺序的该国家内城市
的列表,如下:
Finland: Helsinki.
Germany: Berlin, Frankfurt.
USA: Chicago, New York, Washington.
一个很自然的解决方法是将国家的名称设置为一个哈希结构的键, 和国家名称对应的健值是
这些国家内的城市的一个数组。 每一次, 你读取一行输入, 将其分成国家和城市两个数据。
查看 国家名称 的键所对应的城市列表,然后把新的城市加入那个列表中。当你完成了整个
输入,然后将整个哈希中每个健对应的健值-城市名的列表作一个排序,然后打印出来。
如果哈希值不能是列表,你就无法完成工作了。在 Perl 4 中,哈希的值不能是列表。它们
只能是字符串。 所以你必须把所有的城市名合并成一个字符串。 当需要输出时, 你再把这个
字符串分拆成一个列表, 然后对列表排序, 最后将列表中的数据转成字符串输出。 这样做非
常烦琐并容易出错。而且让人沮丧的是, Perl 已经拥有的优秀的列表功能无法使用了。
解决方法
当 Perl 进化到 Perl 5 时,我们必须考虑到哈希原来的设计 :哈希的键值必须是标量。解决办
法就是采用 引用 。
一个 引用 就是一个指向一个完整列表或完整哈希 (或指向其他的东西,比如函数 ) 的标量值。
名字就是你比较熟悉的一种 引用 。 考虑一下美国的总统:一包杂乱的血肉。但是当我们谈
到它,或者需要在计算机程序中描述它,你需要的只是一个简单的标量 George Bush 。
Perl 中的引用 就像列表和哈希的名字。它们是 Perl 中私有的,内部的名字,所以你可以确
信它们是明确的,不像 George Bush, 一个 引用 只指向一个东西。你总是可以知道它指向
什么。如果你有一个指向数组的 引用 ,你可以从它恢复出整个数组。如果你有一个指向哈
希的 引用 ,你可以根据它恢复出整个哈希。 但是这个 引用 仍旧是一个简单、 紧凑的标量。
你不能使用一个健值是数组的哈希; 哈希的健值必须是标量。 我们被这个束缚住了。 但是一
个简单的 引用 能指向一个完整的数组, 引用 是标量,所以你可以使用指向数组的 引用 组
成的哈希,它就像一个数组的哈希一样,和数据的哈希一样有用。
稍后我们会再回到这个 城市-国家‘ ’的问题来。我们先来看一些操作 引用 的语法。
语法
创建 引用 仅有两种方法,使用它也是两种。
创建引用
创建规则 1
如果你在一个变量前加一个 /号,你就得到了这个变量的 引用 。
$aref = /@array; # $aref 保存着指向 @array 的 引用
$href = /%hash; # $href 保存着指向 %hash 的 引用
当你把 引用 保存在类似
文档评论(0)