gff数据处理

Perl脚本练习

通过数组和哈希引用读取存储复杂数据

要求

gff文件,记录每个基因的名称、起始终止位置、染色体、转录本信息

数据

#注释行
分割:\t
9列:gff格式

思路

  1. 构建一个哈希,结构
my%gene = (
	geneID => {
		'location' => [chrs, start, end]
		'transcripts' => [
			{
				'mRNAID' => 111,
				'chr' => 111,
				'start' => 111,
				'end' =>111
			}
		]
	}
)
  1. 按行读入gff,split,判断注释信息类型,如果为gene,将染色体和位置信息存入以基因ID命名的键中
  2. 如果为mRNA,捕获位置信息,ID和parent信息,根据parent信息将mRNA信息放入对应基因的键中

脚本

use Data::Dumper;
open IN, "D:/test.gff3" or die "$!";
my %geneInfo =();
while(my $line = ){
	chomp $line;
	next if ($line = ~/^#/);
	my@tmp = split (/\t/,$line);
	if ($tmp[2] eq "gene"){
		my $geneID = $tmp[-1] = ~/ID=([^;]+)/;
		$geneInfo{$geneID}{'location'} = [$tmp[0], $tmp[3], $tmp[4]];
		$geneInfo{$geneID}{'transcripts'} = [];
	}
	if ($tmp[2] eq "mRNA"){
		my($mRNAID, $parentID) = ($tmp[-1]= ~/ID=([^;]+).*Parent=([^;]+)/);
		push(@{$geneInfo{$geneID}{'transcripts'}}, {
			"mRNAID"=>$mRNAID, 
			"chr"=>$tmp[0],
			"start"=>$tmp[3],
			"end"=>$tmp[4]
			})
	}
}
print Dumper (\%geneInfo);

for my$id(keys %geneInfo){
	print "@{$geneInfo{$id}{'lication'}}\n";
	if (@{$geneInfo{$id}{'transcripts'}}) >0){
		print "$geneInfo{$id}{'transcripts'}->[0]->{mRNAID}\n";
	}
}

你可能感兴趣的:(perl,生信教程)