# 哈希 3 each 函数 keys 函数练习 # 新建写读模式文件 DNA.txt ,写入 $DNA 内容 $DNA = ">SEQ1\nATCG\n\ATCG>SEQ2\nAAAA\n\TTTT\n" ; open FW , '+>' , 'DNA.txt' or die ; print FW $DNA ; # 读入内容,构建哈希 %DNA, 使其数据如下 =hash %DNA data ---------------------------- key value ---------------------------- SEQ1 ATCGATCG SEQ2 AAAATTTT ---------------------------- =cut $/ = ">" ; # 将行结束符设为 > seek FW , 0 , 0 ;
; # 空读一行,返回的是 > while ( $seq =
){ chomp ( $seq ); # 切去行尾符 ( $seq_num , @seqs )= split /\n/ , $seq ; $DNA { $seq_num } = join '' , @seqs ; } # 按格式输出哈希 %DNA 如下 =output SEQ1 SEQ2 顺序不定 ------------------------ name sequence SEQ1 ATCGATCG SEQ2 AAAATTTT ------------------------ =cut print "name\tsequence\n" ; # 第一种方法 用 each 函数 while (( $name , $sequence ) = each %DNA ){ print " $name \t $sequence \n" ; } # 第二种方法 用 keys 函数 foreach $name ( keys %DNA ){ print $name , "\t" , $DNA { $name }, "\n" ; } =homework 练习 keys 函数 在前面代码的基础上,在哈希中添加一项, key 为 SEQn , 其中 n 为 key 总数目 +1 ; value 为所有 keys 对应值的字符 串相连。然后将哈希 %DNA 从头写入 DNA.txt ,格式为: ">SEQ1\nATCGATCG\n>SEQ2\nAAAATTTT>SEQ3\n.....\n" 注意:添加了 > =cut seek FW , 第一空 , 0 ; @keys = 第二空 ( keys %DNA ); # 取 keys 排序后赋值数组 $last_key = "SEQ" . ( @keys + 1 ); # 确定 last_key for $key ( 第三空 ){ # 遍历 key, 取值累加入 last_key $DNA { 第四空 } .= $DNA { 第五空 }; } for $key ( sort 第六空 %DNA ){ #取新 key,排序,再遍历 件 print FW " 第七空 " , $key , "\n" , $DNA { 第八空 }, "\n" ; } seek FW , 0 , 0 ; print
; close FW ; unlink 'DNA.txt' ; =result name sequence SEQ2 AAAATTTT SEQ1 ATCGATCG SEQ2 AAAATTTT SEQ1 ATCGATCG >SEQ1 ATCGATCG >SEQ2 AAAATTTT >SEQ3 ATCGATCGAAAATTTT =cut