搜索
查看: 2989|回复: 6

[Perl] 关于第零题中,对fasta格式的文件按序列长度排序的问题

[复制链接]

16

主题

61

帖子

513

积分

高级会员

Rank: 4

积分
513
发表于 2017-6-6 22:43:31 | 显示全部楼层 |阅读模式
邀请大神们进来讨论,点对点的提问很可能打扰到人家,所以来写帖子,请教大家,希望学有余力的小伙伴帮忙解决,互相提高。下面是课程中老师的代码,首先感谢老师的代码。
[AppleScript] 纯文本查看 复制代码
#order the sequence by length  按序列长度排序
open FASTA,"longreads.fa"; #读入文件
open OUTPUT,">len_sort_longreads.fa"; #输出文件
while(<FASTA>) { #读入文件句柄
      if(/>/) {$header=$_;}  #匹配fasta中的首行
      else{$seq{$header}=$_;#sequence和header进行hash,键:header;值:$_(序列),这个hash就是%seq
	       $len=length($_);#求序列长度
           push @{$order{$len}},$header;[color=#ff0000]#序列长度与次序进行hash,%order,键:序列长度;值:次序。函数push对数组操作,将次序看成数组,每次添加一个                                                          header进入???(这句不是很理解,望大家解答!!!)[/color]
	       #print @{$order{$len}}     #想用这句做测试用来,但是满屏数字我很晕
		   };
      END {  
      foreach $p (sort {$b<=>$a} keys %order) #按数字比较
             {foreach(@{$order{$p}}){print OUTPUT "$_$seq{$_}"} }  #foreach遍历每一个变量
           }
                }

1、代码中的问题已标红,希望大神们回答一下。
2、@{$order{$len}}还是这一句,我觉得fasta中肯定有序列的长度是相等的,根据hash的定义,键必须唯一,这样长度相等的序列,会造成键不唯一,这样是不是有问题。
3、个人看书自学的理解,Google能力一般,还在深化学习ing.....,如有不妥的地方,望多多包涵,谢谢!



上一篇:R语言初学者必备-cheatsheet大全
下一篇:推荐使用R包RTCGA下载数据
回复

使用道具 举报

634

主题

1182

帖子

4030

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4030
发表于 2017-6-6 23:49:12 | 显示全部楼层
#print @{$order{$len}}     #想用这句做测试用来,但是满屏数字我很晕
这个里面存储的数组的地址,地址无法阅读的。
你可以 print join"\t",@{$order{$len}}   
你这个问题很复杂,需要打赏,请点击 http://www.bio-info-trainee.com/donate 进行打赏,谢谢
回复 支持 反对

使用道具 举报

634

主题

1182

帖子

4030

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4030
发表于 2017-6-6 23:51:23 | 显示全部楼层
@{$order{$len}} 这个里面是数组呀,以@开头的都是数组,你为什么认为是hash呢?
你这个问题很复杂,需要打赏,请点击 http://www.bio-info-trainee.com/donate 进行打赏,谢谢
回复 支持 反对

使用道具 举报

16

主题

61

帖子

513

积分

高级会员

Rank: 4

积分
513
 楼主| 发表于 2017-6-7 09:20:20 | 显示全部楼层
Jimmy 发表于 2017-6-6 23:51
@{$order{$len}} 这个里面是数组呀,以@开头的都是数组,你为什么认为是hash呢? ...

我知道它整体是数组,这个哈希%order的值$order{$len}充当数组,我最不太理解的是用push的目的是啥???push后构成了一个新的数组,这个数组是这样的@{order和header},我试过把这句删除,无法的到正确结果。
回复 支持 反对

使用道具 举报

16

主题

61

帖子

513

积分

高级会员

Rank: 4

积分
513
 楼主| 发表于 2017-6-7 09:40:28 | 显示全部楼层
Jimmy 发表于 2017-6-6 23:49
#print @{$order{$len}}     #想用这句做测试用来,但是满屏数字我很晕
这个里面存储的数组的地址,地址无 ...

C:\Users\Administrator\Desktop\360截图20170607093827667.jpg打印结果如图所示

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

58

主题

103

帖子

756

积分

版主

Rank: 7Rank: 7Rank: 7

积分
756
QQ
发表于 2017-6-7 10:48:09 | 显示全部楼层
泥土 发表于 2017-6-7 09:40
打印结果如图所示

我觉得你还是没懂哈希,基础概念有点混乱呀
你看看这个帖子:
perl数组哈希使用
回复 支持 反对

使用道具 举报

16

主题

61

帖子

513

积分

高级会员

Rank: 4

积分
513
 楼主| 发表于 2017-6-7 11:47:55 | 显示全部楼层
本帖最后由 泥土 于 2017-6-7 13:26 编辑
Panda姐 发表于 2017-6-7 10:48
我觉得你还是没懂哈希,基础概念有点混乱呀
你看看这个帖子:
perl数组哈希使用 ...

谢谢这个链接的分享,我好像是懂了,那这句push @{$order{$len}},$header;要达到的目的就是  将单个key中的所有value放到一起,应该还是键:长度,值:header。@{$order{$len}}存放1个或者多个header的那个数组,这好像就是所谓的哈希数组。感觉这个知识点好烧脑,http://blog.sina.com.cn/s/blog_65ba09d90101gn3z.html,我觉得的说的比较直观。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2019-7-18 09:28 , Processed in 0.039355 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.