Chinaunix首页 | 论坛 | 博客
  • 博客访问: 148006
  • 博文数量: 47
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 402
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-11 10:08
文章存档

2013年(47)

我的朋友

分类: PERL

2013-03-13 15:47:09

Perl能使复杂的事情变得简单,方法是让你假装那些复杂的数值实际上是简单的东西.换句话说,Perl让你可以操作简单的标量,而这些标量碰巧是指向复杂数组和散列的引用.

Perl复杂数据结构
  数组和散列是易用、简单平面的数据结构,很不幸,现实总不能如人所愿。 很多时候你需要使用很难、复杂而且非平面的数据结构。Perl 能使复杂的事情变得简单。方法是让你假装那些复杂的数值实际上是简单的东西.换句话说,Perl 让你可以操作简单的标量,而这些标量碰巧是指向复杂数组和散列的引用.在自然语言中,我们总是用简单的单个名词来表示复杂的难以理解的实体,比如,用"政府"来代表一个关系复杂的硬壳等等.
  
  继续讨论上个例子,假设我们想讨论 Jacob 的妻子而不是 Adam 的,而 Jacob 有四个妻子(自己可别这么干)。为了在 Perl 中表示这个数据结构,我们会希望能将 Jocob 的四个妻子当成一个来处理,但是我们会遇到一些问题。你可能认为我们可以用下面的语句来表示:
  
  $wife{"Jacob"} = ("Leah", "Rachel", 'Bilhah", "Zilpah");# 错
  但是这并不能象你希望的那样运转,因为在 Perl 中括弧和逗号还不够强大,还不能将一个列表转换成为标量(在语法中,圆括弧用于分组,逗号用于分隔)。你需要明确地告诉 Perl 你想将一个列表当成一个标量。[] 中括弧能够实现这个转换:
  
  $wife{"Jacob"} = ["Leah", "Rachel", "Bilhah", "Zilpah"];# 正确
  这个语句创建了一个未命名的数组,并将这个数组的引用放入散列的元素 $wife{“Jacob”} 中.因此我们有了一个命名的散列,其中包含了一个未命名的数组. 这就是 Perl 处理多维数组和嵌套数据类型的方法.同普通数组和散列的赋值方法一样,你可以单独对其进行赋值:
  
  $wife{"Jacob"}[0] = "Leah";
  $wife{"Jacob"}[1] = "Rachel";
  $wife{"Jacob"}[2] = "Bilhah";
  $wife{"Jacob"}[3] = "Zilpah";
  你可以从上边看出,这看起来象一个具有一个字符串下标和一个数字下标的多维数组.为了更多了解树状结构,如嵌套数据结构,假设我们希望不仅能列出 Jocob 的妻子,而且同时能列出每个妻子的所生的儿子。这种情况下,我们希望将散列结构也当成一个标量,我们可以使用花括弧来完成(在每个散列值中,象上个例子一样用中括弧表示数组,现在我们有了一个在散列中的散列中的数组)。
  
  $kids_of_wife{"Jacob"} = {
  "Leah"=> ["Reuben", "Simeon", "Levi", "Judah", "Issachar", "Zebulun"],
  "Rachel" => ["Joseph", "Benjamin"],
  "Bilhah" => ["Dan", "Naphtali"],
  "Zilpah" => ["Gad", "Asher"],};
  同样,我们也可以象下面这样表示:
  
  $kids_of_wife{"Jacob"}{"Leah"}[0]= "Reuben";
  $kids_of_wife{"Jacob"}{"Leah"}[1]= "Simeon";
  $kids_of_wife{"Jacob"}{"Leah"}[2]= "Levi";
  $kids_of_wife{"Jacob"}{"Leah"}[3]= "Judah";
  $kids_of_wife{"Jacob"}{"Leah"}[4]= "Issachar";
  $kids_of_wife{"Jacob"}{"Leah"}[5]= "Zebulun";
  $kids_of_wife{"Jacob"}{"Rachel"}[0] = "Joseph";
  $kids_of_wife{"Jacob"}{"Rachel"}[1] = "Benjamin";
  $kids_of_wife{"Jacob"}{"Bilhah"}[0] = "Dan";
  $kids_of_wife{"Jacob"}{"Bilhah"}[1] = "Naphtali";
  $kids_of_wife{"Jacob"}{"Zilpah"}[0] = "Gad";
  $kids_of_wife{"Jacob"}{"Zilpah"}[1] = "Asher";
  可以从上面看出,在嵌套数据结构中增加一层,就像在多维数组中增加了一维。在 Perl 内部表示是一样的,但是你可以用任何一种方法来理解。
  
  这里最重要的一点就是,Perl 可以用简单的标量来代表复杂数据结构。Perl利用这种简单的封装方法构建了基于对象的结构。当我们用下面的方法调用 Camel 对象的构造函数的时候:
  
  $fido = new Camel "Amelia";
  我们创建了一个 Camel 对象,并用标量 $fido 来代表。但是在 Camel 对象里面是很复杂的。作为优秀的面向对象的程序员,我们不想关心 Camel 对象里面的细节(除非我们是实现 Camel 类方法的人)。但是一般说来,一个对象的组成中会有一个包含对象属性的散列。例如它的名字(本例子中,是“Amelia”而不是“fido”),还有驼峰的数量(在这里我们没有明确定义,因此使用缺省值 1,和封面一样)。

阅读(842) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~