免费注册 查看新帖 |

Chinaunix

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

求助:hash value不能自动变成另一个hash的ref [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-23 17:30 |只看该作者 |倒序浏览
本帖最后由 午夜凋零 于 2015-04-23 17:31 编辑
  1. my %hash;
  2. $hash{"abc"} = 1;
  3. print Dumper(\%hash);
  4. $hash{"abc"}->{"a"} = "b";
  5. print Dumper(\%hash);
复制代码
这样写,会报一个ERROR或者Warning:
  1. Can't use string ("1") as a HASH ref while "strict refs" in use at ./0423 line 30, <$fi> line 4.
复制代码
在中间加上一行,或者将第2行那个1改为{},都可以通过。
  1. my %hash;
  2. $hash{"abc"} = 1; # or change 1 to {}
  3. print Dumper(\%hash);
  4. $hash{"abc"} = {}; # new add
  5. $hash{"abc"}->{"a"} = "b";
  6. print Dumper(\%hash);
复制代码
有点想不明白是怎么回事,为什么hash不能自动将那个value 1变为一个hash的ref?
求教,不胜感谢~~

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
2 [报告]
发表于 2015-04-23 17:52 |只看该作者
本帖最后由 104359176 于 2015-04-23 17:55 编辑

这是 Perl 语言中很容易出错的地方,因为数组和散列提取元素时的名称和不提取元素时的名称不一致:

以下两种写法是正确的:
  1. my %hash;

  2. $hash{'key'}{'value'} = 1;
复制代码
  1. my $hash = {};

  2. $hash->{'key'}{'value'} = 1;
复制代码
所以你的代码是因为 -> 放错了位置:
  1. my %hash;
  2. $hash{"abc"} = 1; # or change 1 to {}
  3. print Dumper(\%hash);
  4. $hash{"abc"} = {}; # new add
  5. $hash{"abc"}{"a"} = "b";
  6. print Dumper(\%hash);
复制代码
在 Perl 6 中,这个坑被填平了:
  1. my %hash;
  2. %hash{'key'}{'value'} = 1;

  3. my $hash = {};
  4. $hash{'key'}{'value'} = 1;
复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2015-04-23 23:38 |只看该作者
有点想不明白是怎么回事,为什么hash不能自动将那个value 1变为一个hash的ref?


把 1 自动变 hashref 是怎么个逻辑,脑袋秀逗了?

autovivification 特性是有严格要求的,只对不存在的或值为undef 的项自动生hashref 或 arrayref。

你这里 1 明显不是 undef 是个有意义的值,按你想的那类型系统也太随意了,怎么能悄无声息的擦除我有用的值,我只是拼写错误怎么办?当然如果你不开 use strict; 那代码会成功执行的,只是变成符号引用多了个 %1 全局变量!!!这是个错误示范,永远用 use strict;

autovivification

    A Graeco-Roman word meaning “to bring oneself to life”. In Perl, storage locations (lvalues) spontaneously generate themselves as needed, including the creation of any hard reference values to point to the next level of storage. The assignment $a[5][5][5][5][5] = "quintet" potentially creates five scalar storage locations, plus four references (in the first four scalar locations) pointing to four new anonymous arrays (to hold the last four scalar locations). But the point of autovivification is that you don’t have to worry about it.
AV



二楼人很热心,不过这里吐槽偏太远了  和 -> 没有关系,两级索引之间的 -> 可以省略,因为只要是两级索必定要解引用

论坛徽章:
0
4 [报告]
发表于 2015-04-29 11:26 |只看该作者
104359176 发表于 2015-04-23 17:52
这是 Perl 语言中很容易出错的地方,因为数组和散列提取元素时的名称和不提取元素时的名称不一致:

以下 ...


非常感谢你的回答。

好像你没有理解我的意思,我的code中,hash是一个哈希,不是变量,因此,那个->的位置并没有错,如果写成$hash->{'a'}{'b'},此时hash就是一个变量了,不是哈希了。

论坛徽章:
0
5 [报告]
发表于 2015-04-29 11:35 |只看该作者
回复 3# zhlong8

感谢版主解答,学习到了。
当初设了一个1,主要是想在那里站个位子,没想到后续出现这么多问题。

   

论坛徽章:
0
6 [报告]
发表于 2015-04-29 11:37 |只看该作者
你可以通过赋值来把1变为你想要的hashref.
  1. $hash{"abc"}= {"a" =>"b" };
复制代码
版主解释的很清楚了,计算机没有权利自动来擦除你已赋予的值,这不合理

论坛徽章:
0
7 [报告]
发表于 2015-04-29 12:47 |只看该作者
回复 6# kk861123


    嗯。明白了,很感谢你的回答,谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP