




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第三章 哈希 n哈希又被称为散列或关联数组,是一种数据结构,可以包含任意多个 值,并以“键”来寻找相应的值;键通常都是字符串,且可以是任意 字符串,但彼此间不能相同,对应的值则不受此限制。 哈希的定义 哈希的用途 n如果两组数据间存在一一对应的关系,且一组数据中的标 量值不存在重复,这时可以使用哈希。例如: 按IP地址查找主机名 按身份证号找出姓名 按单词统计其出现次数 按基因名查找ORF 按蛋白质ID查找氨基酸序列或结构 从DNA到Protein 哈希赋值 n类似于数组,不同的是用于赋值的列表是一些“键/值” 对。例如: %postcode=(Beijing, 100000, Shangha
2、i, 200001, Nanjing, 210001, Shenyang, 110001); n注意:哈希里面的元素是没有顺序的,因此输出的时候不 一定是原来赋值的顺序,但是对应的“键/值”不会变化。 postcode=%postcode; print “postcode”; #不能为“%postcode” n胖箭头= 它相当于“,”,使赋值看上去更直观。 %postcode=( “Beijing”=100000, “Shanghai” =200001, “Nanjing” =210001, “Shenyang” =110001,); 注意: (I)使用胖箭头,可以省略键的引号; (II)最后
3、一个逗号,不是必需的,但最好写上。 n哈希复制给哈希:%hash0=%hash1 n数组给哈希赋值:%hash=a; 访问hash元素 n访问hash元素,可以使用下面的语法: $hash $key %family_name=(fred=flintstone, barney=rubble); print $family_namefred.n; print $family_namebarney.n; foreach $person (qw) print $person : $family_name$person.n; n哈希的键值可以为表达式 $str = bar; print $family_
4、name$str.ney n对已存在元素赋值会覆盖之前的值 $family_namebarney=astaire; n哈希元素因赋值而诞生 $family_namewilma=rubble; n访问不存在的元素返回undef $granite= $family_namelarry 练习:对下表中的基因及相应的表达量构建哈希,从键盘输 入其中一个基因名,并打印其相应的表达量。 %gene_exp=(recA, 2.30, recB, 2.27 , recC, 2.42 , recD, 2.13 , recF, 1.24); print Enter the gene name:; chop ($f
5、ind=); print $find has the expression values $gene_exp$findn; reverse函数 n进行操作reverse %hash,会先将hash转换成“键/值”对的列表形式 ( key1,value1,key2,value2keyn,valuen),然后翻转列表同 时键值互换,生成(valuen,keyn,value2,key2,value1, key1),此时原来的值成为键,键成为值。该操作适用于键和值一一 对应的情况,否则会造成值丢失。 %postcode=(Beijing, 100000, Shanghai, 200001, Nanji
6、ng,210001, Shenyang,110001); citycode1= %postcode; citycode2=reverse %postcode; print citycode1n; print citycode2; keys和values函数 nkeys返回键列表,values返回值列表。 %postcode=(Beijing, 100000, Shanghai, 200001, Nanjing,210001, Shenyang,110001); keys1=keys %postcode; values1=values %postcode; $keys1=keys %postco
7、de; print keys1n; print values1n; print $keys1; each函数 neach用于迭代访问整个哈希,以包含两个元素的列表形式 返回“键/值”对,每调用一次each,返回下一组“键/值 ”对,通常用于while控制结构中。 %postcode=(Beijing, 100000, Shanghai, 200001, Nanjing,210001, Shenyang,110001); while($key,$value)=each %postcode) print $key=$valuen; 遍历哈希中的错误 访问哈希切片 n切片(slice)就是把数组或散
8、列中的部分元素提取到一个新 的数组。 nexists函数 用来检查哈希中是否存在某个键,与键对应的值无关。 if(exists $books$dino) print “Hey, theres a library card for dino!n”; 注意:即使某个键对应的值为空,它仍然存在。 ndelete函数 用于删除哈希中某个键及其对应的值 $person = “betty”; delete $books$person; #将$person 的借书卡删除掉 n获取哈希大小 %ages = (Martin = 28, Sharon = 35, Rikke = 29); print Hash s
9、ize: ,scalar keys %ages,n; print Hash size: ,scalar values %ages,n; delete和exist的示例 %last_name = ( Jaime = Fraser, Brendan = Fraser, Lenny = Teytelman, Venky = Iyer, ); print scalar keys %last_name ,n; delete $last_nameJaime; print scalar values %last_name ,n; if (exists $last_nameJaime) print Jaime
10、 has a last name!; else print Your name dose not exist!; 哈希排序 n按键排序 %hash = ( 123 = 54, 323 = 165, 22 = 73, ); foreach $key ( sort keys %hash ) print $key: $hash$keyn; print n; foreach $key ( sort $a$b keys %hash ) print $key: $hash$keyn; n按值排序 %hash=(Beijing, 107, Shanghai, 98, Nanjing, 100, Shenya
11、ng, 927); foreach $key ( sort $hash$a $hash$b keys %hash) print $key: $hash$keyn; print n; foreach $key ( sort $hash$b $hash$a keys %hash) print $key: $hash$keyn; print n; foreach $key ( sort $hash$a cmp $hash$b keys %hash) print $key: $hash$keyn; print n; foreach $key ( sort $hash$b cmp $hash$a key
12、s %hash) print $key: $hash$keyn; n联合键值排序 %userids = ( williams = Marketing, smith = Research, johnson = Research, jones = Marketing, brown = Marketing, davis = Research ); foreach (sort ($userids$a cmp $userids$b) | ($a cmp $b) keys %userids) print $_: $userids$_n; 哈希使用示例 n打印数组中不重复的元素 fishwords = (o
13、ne,fish,two,fish,red,fish,blue,fish); %seen = (); foreach (fishwords) $seen$_ = 0; uniquewords = keys %seen; val = values %seen; print uniquewords; print n; print val; n打印两个数组中相同或不同的元素 grep按某种模式expr去匹配数组中的每个元素,匹配成功的元素组成 一个新的数组,返回该新数组。 grep EXPR, LIST array = qw(greyhound bloodhound hello hand); houn
14、d = grep /hound/,array; print houndn; #打印出greyhound和bloodhound 练习:利用哈希统计单词数 假设某个文件包含一列单词,我们可以将其内容先读到数 组中,然后将其作为哈希键值进行操作,那么该单词出现 的次数就是该键对应的值 file=qw/beijing shanghai wuhan zhejiang wuhan hubei beijing jilin qingdao liuzhou zhejiang/; foreach $word (file) $count$word+=1; while($key,$value)=each %count
15、) print $key=$valuen; 哈希的数组(Array of Hash) n格式 AoH = ( husband = barney, wife = betty, son = bamm, husband = george, wife = jane, son = elroy, husband = homer, wife = marge, son = bart, ); n添加元素 push AoH, husband = fred, wife = wilma, daughter = pebbles ; 生成AOH n已有文件中的数据格式如下 : husband=fred friend=ba
16、rney husband=paul friend=laurie n生成AOH的代码如下: while ( ) $rec = ; foreach $field ( split ) ($key, $value) = split /=/, $field; $rec-$key = $value; push AoH, $rec; 单箭头引用 访问和打印AOH n访问单个元素格式: $AoH0husband; n遍历打印AOH foreach $href ( AoH ) print ; foreach $role ( keys %$href ) print $role=$href-$role ; prin
17、t n; foreach $i ( 0 . $#AoH ) print $i is ; foreach $role ( keys % $AoH$i ) print $role=$AoH$i$role ; print n; 数组的哈希(Hash of Array) n格式 %HoA = ( flintstones = fred, barney , jetsons = george, jane, elroy , simpsons = homer, marge, bart , ); n添加元素 $HoAteletubbies = tinky winky, dipsy, laa-laa, po ; 生
18、成HOA n已有文件中的数据格式如下 : flintstones: fred barney wilma dino jetsons: george jane elroy simpsons: homer marge bart n生成HOA的代码如下: while ( $line = ) ($who, $rest) = split /:s*/, $line, 2; fields = split , $rest; $HoA$who = fields ; s 是空格,*表示可以 有多个空格分隔。 访问和打印HOA n访问单个元素: $HoAflintstones0; n遍历打印HOA: 哈希的哈希(Hash of Hash) %microarray_set = ( time0 = recA = 2.0, recB = 2.0, recC = 2.0, time2 = recA = 2.0, recB = 4.0, recC = 1.7, time4 =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北京店铺转让合同范本
- 南山区代理记账合同范本
- 二年级口算题题库100道
- 劳务公司结账合同范本
- 农场水面出租合同范本
- 2025重庆市建筑安全员-A证考试题库附答案
- 公司收购农民合同范本
- 出借女友合同范本
- 高校足球队足球整体战术训练模式实证探析
- 印刷制作设计合同范本
- 2025年上海市商品交易市场进场经营合同(2篇)
- 2025年全国幼儿园教师资格证考试教育理论知识押题试题库及答案(共九套)
- 2024年郑州电力高等专科学校高职单招职业适应性测试历年参考题库含答案解析
- 产品试产流程
- 舞台机械基础知识培训
- 人教版数学八年级下册 第16章 二次根式 单元测试(含答案)
- 中学班主任培训内容
- DB2301-T 108-2022 地下管线探测技术规程
- DB51T 1511-2022建设项目对自然保护区自然资源、自然生态
- DCMM练习题练习试题
- 2024年湘教版初中地理一轮复习专题三 天气与气候
评论
0/150
提交评论