免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5223 | 回复: 23
打印 上一主题 下一主题

嵌套的复合结构?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-22 12:46 |只看该作者 |倒序浏览
大家帮我看看下面的嵌套结构式咋回事,第三个键c 对应的值是不是数组?,而数组对应的元素有2个,都是哈希,是不是这样!
我试着访问c的值即数组的第一个元素即哈希的键d对应的元素,为什么行不通(应该是2)
访问方法:print $hash{c}[0]{d};  结果提示Not an ARRAY reference at 。。。。 是怎么回事!  
而我访问 print $hash{c};  它提示是哈希的引用,为什么不是数组的引用?

my %hash=(a=>3,
            b=>5,
           c=>{{d=>2,
              e=>4
             },
             {d=>2,
              e=>4
             }
             }
   );

[ 本帖最后由 drosophilia 于 2009-6-22 12:47 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-06-22 12:51 |只看该作者
把 { 改成 [


my %hash= (
            a =>3,
            b =>5,
            c  =>  [{ d => 2,
                          e => 4, },
                       { d => 2,
                          e => 4, },],
);

[ 本帖最后由 cobrawgl 于 2009-6-22 12:57 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-06-22 13:09 |只看该作者
数组的散列

如果你想用一个特定的字串找出每个数组,而不是用一个索引数字找出它们来,那么你就要用数组的散列。在我们电视角色的例子里,我们不是用第零个,第一个等等这样的方法查找该名字列表,而是设置成我们可以通过给出角名字找出演员列表的方法。

因为我们外层的数据结构是一个散列,因此我们无法对其内容进行排序,但是我们可以使用 sort 函数声明一个特定的输出顺序。
[编辑] 数组的散列的组成

你可以用下面的方法创建一个匿名数组的散列:

   # 如果键字是标识符,我们通常省略引号
   %HoA = (
      flintstones    => [ "fred", "barney" ],
      jetsons   => [ "george", "jane", "elroy" ],
      simpsons   => [ "homer", "marge", "bart" ],
   );

要向散列增加另外一个数组,你可以简单地说:

   $HoA{teletubbies} = [ "tinky winky", "dipsy", "laa-laa", "po" ];

论坛徽章:
0
4 [报告]
发表于 2009-06-22 14:12 |只看该作者
原帖由 cobrawgl 于 2009-6-22 12:51 发表
把 { 改成 [


my %hash= (
            a =>3,
            b =>5,
            c  =>  [{ d => 2,
                          e => 4, },
                       { d => 2,
                       ...


是不是说上面我写的表达式是错误的,因为{}表示的是匿名哈希,而里面的结构则不是哈希,所以不对,是吗?但为啥运行没报错!
感谢 Perl_Er的讲解,让我对哈希,数组的相互嵌套有一个了解,有一个问题有点不明白,就是:
按一楼cobrawgl 的例子来说,$hash{c}是一个匿名数组的引用,数组有2个元素,都是哈希的应用,访问第一个哈希引用,则是$hash{c}[0]或$hash{c}->[0]
这里为什么不是$$hash{c}[0]或$$hash{c}->[0], 前面都加了$, 这样访问则报错

实际上如果$foo是一个引用,那么访问引用所指对象的某个元素时,前面一定要加一个$,   这样说来,上下岂不矛盾,请高人解惑!thanks


论坛徽章:
0
5 [报告]
发表于 2009-06-22 14:33 |只看该作者

回复 #4 drosophilia 的帖子

为什么不是$$hash{c}[0]或$$hash{c}->[0],   --> 不对

应该是  ${$hash{c}}[0]  or ${$hash{c}}->[0]

my %hash= (
            a =>3,
            b =>5,
            c  =>  [{ d => 2,
                          e => 4, },
                       { d => 2,
                          e => 4, },],
);

$hash{c} : 匿名数组的引用
@{$hash{c}}: 被dereference后的匿名数组

[ 本帖最后由 Perl_Er 于 2009-6-22 16:03 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2009-06-22 14:51 |只看该作者
原帖由 drosophilia 于 2009-6-22 14:12 发表


是不是说上面我写的表达式是错误的,

表达式没有错误,{ { b => 1, e => 2 }, { b => 1, e => 2} } 返回一个到 hash 的引用,被指向的 hash 只有一个 key/value 对,key 等于第一个 { b=> 1, e => 2 } 返回值被当作字符串处理的结果,即 HASH(0xXXXXXXXX), value 等于第二个 { b => 1, e => 2 } 返回的的结果,是一个到 hash 的引用。

论坛徽章:
0
7 [报告]
发表于 2009-06-23 10:41 |只看该作者
原帖由 MMMIX 于 2009-6-22 14:51 发表

表达式没有错误,{ { b => 1, e => 2 }, { b => 1, e => 2} } 返回一个到 hash 的引用,被指向的 hash 只有一个 key/value 对,key 等于第一个 { b=> 1, e => 2 } 返回值被当作字符串处理的结果,即 HASH(0xX ...



高,明白了,原来这个匿名哈希不是用=> 来构建的,而是最原始的构建方法,即用数组来构建哈希,数组里面的元素是成对的,第一个是key,第二个是值,这里只有一对,即哈希就一个键值对,对吧!

谢谢了!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2009-06-23 10:58 |只看该作者
原帖由 drosophilia 于 2009-6-23 10:41 发表



高,明白了,原来这个匿名哈希不是用=> 来构建的,而是最原始的构建方法,即用数组来构建哈希,数组里面的元素是成对的,第一个是key,第二个是值,这里只有一对,即哈希就一个键值对,对吧!

谢谢了!

=> 就是逗号,逗号就是 =>

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2009-06-23 13:03 |只看该作者
原帖由 flw 于 2009-6-23 10:58 发表

=> 就是逗号,逗号就是 =>

这个说法是不准确的,不过在一级近似的情况下,也是可以接受的。

论坛徽章:
0
10 [报告]
发表于 2009-06-23 13:07 |只看该作者
连字符 => 大多数时候就是逗号操作符的同义词
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP