免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: hztj2005
打印 上一主题 下一主题

哪位朋友有三重哈希构建、遍历、查询的例子 [复制链接]

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
11 [报告]
发表于 2016-08-10 11:46 |只看该作者
那我想问下, 如果想查询 '颜色' 这个关键词 包含哪些字, 该如何操作? 好像随着汉子的增多 查询起来 效率还真是个事! (如果 义项 是个通用词的话)

论坛徽章:
0
12 [报告]
发表于 2016-08-10 12:31 |只看该作者
sunzhiguolu 发表于 2016-08-10 11:46
那我想问下, 如果想查询 '颜色' 这个关键词 包含哪些字, 该如何操作? 好像随着汉子的增多 查询起来 效率还真 ...



my $char = '颜色';
my $pinyin = 'yanse';
    #获取语义项
my $meaning_aref = $href->{$char}->{$pinyin};

print @$meaning_aref[1];

我对perl数组的实现原理没理解透,按上面代码就是直接my $char = '颜色' ,perl竟然能直接取出数据。
如果在C语言中,程序必须有搜索过程,通常就是排序后折半查找。
当然在C++的标准库中,印象也有perl类似的功能,用关键字key做下标{key}取数据value。

也许perl内部会对数组进行排序。但这样又有一个问题,就是打乱了数据的原有秩序。


论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
13 [报告]
发表于 2016-08-10 13:09 |只看该作者
本帖最后由 sunzhiguolu 于 2016-08-10 14:29 编辑

回复 12# hztj2005
我对perl 数组 的实现原理没理解透,按上面代码就是直接my $char = '颜色' ,perl竟然能直接取出数据。

老人家 这个是 hash 的 hash, 值 是一个 数组的引用.

还有就是, 我在前面的所说的 关键词 '颜色' 并非以键的形式进行查找. 而是作为 义项 内容进行查找.

   

论坛徽章:
0
14 [报告]
发表于 2016-08-10 14:01 |只看该作者
sunzhiguolu 发表于 2016-08-10 13:09
回复 12# hztj2005

老人家 这个是 hash, 值 是一个 数组的引用.


my $ref_type = ref $href;

print "$ref_type\n";

我用这两行代码看了一下,$href还真是一个哈希。那正好能满足我的应该,通过汉字查义项。

push @{ $href->{'红'}->{'hong'} }, '颜色'; #1维哈希+2维数组。


那么我想知道,怎样的语法,才建立一个3维数组?


至于你要查义项内的“颜色”,除非另建索引,不然没有什么捷径。

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
15 [报告]
发表于 2016-08-10 14:29 |只看该作者
本帖最后由 sunzhiguolu 于 2016-08-10 14:33 编辑

回复 14# hztj2005
上面的那个回帖, 我没有修改成功. 抱歉, 有些地方可能不太正确, 以这个为准, 如有问题也请大家指正 避免误导.
$href 是一个 hash 引用, 而它 本身引用的是一个 hash 的 hash, 其值为 数组的引用.
比如 汉字 '红' 是 $ref 的 key, 而 拼音 'hong' 则是 '红' 下的一个名为 'hong' 的匿名 hash 引用, 它的值才是 那个数组的引用.

另外, 您老人家 所说的 3维数组, 是个啥意思? 有啥特殊用途吗, 2维数组足以了吧.

   

论坛徽章:
0
16 [报告]
发表于 2016-08-10 17:44 |只看该作者
谁知道一个hash表多个key,有这样的开源实现吗?

论坛徽章:
0
17 [报告]
发表于 2016-08-10 19:06 |只看该作者
sunzhiguolu 发表于 2016-08-10 14:29
回复 14# hztj2005
上面的那个回帖, 我没有修改成功. 抱歉, 有些地方可能不太正确, 以这个为准, 如有问题 ...


谢谢指点!测试了下确实如此。是否 -> 都是表示哈希引用?


push @{ $href->{'红'}->{'hong'} }, '颜色';
push @{ $href->{'红'}->{'hong'} }, '红色代表着吉祥、喜气、热烈、奔放、激情、斗志、革命。';
push @{ $href->{'红'}->{'hong'} }, '可见光谱中长波末端的颜色,波长大约为610到750纳米,类似新鲜血液的颜色,是三原色和心理原色之一。';

# 查询
my $char = '红';
my $pinyin = 'hong';
    #获取语义项
my $meaning_aref = $href->{$char}->{$pinyin};

print @{$meaning_aref}[1];
print "\n";
print @$meaning_aref[1];
print "\n";
print $$meaning_aref[1];
print "\n";
print ${$meaning_aref}[1];
print "\n";
print ("@{$meaning_aref}\n");

print "\n";

my $ref_type = ref $href;
print "$ref_type\n";

my $ref_type2 = ref $href->{$char};
print "$ref_type2\n";


my $ref_type3 = ref $href->{$char}->{$pinyin};
print "$ref_type3\n";

输出结果:
红色代表着吉祥、喜气、热烈、奔放、激情、斗志、革命。
红色代表着吉祥、喜气、热烈、奔放、激情、斗志、革命。
红色代表着吉祥、喜气、热烈、奔放、激情、斗志、革命。
红色代表着吉祥、喜气、热烈、奔放、激情、斗志、革命。
颜色 红色代表着吉祥、喜气、热烈、奔放、激情、斗志、革命。 可见光谱中长波末端的颜色,波长大约为610到750纳米,类似新鲜血液的颜色,是三原色和心理原色之一。

HASH
HASH
ARRAY

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
18 [报告]
发表于 2016-08-10 19:37 |只看该作者
回复 17# hztj2005

-> 是使用引用

http://bbs.chinaunix.net/thread-504623-1-1.html   

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
19 [报告]
发表于 2016-08-10 19:56 |只看该作者
不用谢
另外print @$meaning_aref[1];可以直接写成 print $meaning_aref->[1];

论坛徽章:
0
20 [报告]
发表于 2016-08-10 21:33 |只看该作者
jason680 发表于 2016-08-10 19:37
回复 17# hztj2005

-> 是使用引用


谢谢!好文,写得简明扼要。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP