2013-04-24 72 views
1

我试图写一个Perl程序,它会分裂出一个FASTA头:到它|分隔件我应该使用什么数据结构来存储.fasta头文件集合?

gi|4140243|dbj|AB022087.1|_Xenopus_laevis_mRNA_for_cytochrome_P450,_complete_cds,_clone_MC1 

gi 
4140243 
dbj 
AB022087.1 
_Xenopus_laevis_mRNA_for_cytochrome_P450,_complete_cds,_clone_MC1 

我可以做到这一点使用split

my @hits = split(/\|/, $hits); 

my ($gi, $number, $gb, $id, $name); 
foreach (@hits) { 
    $gi.= "$hits[0]\n"; 
    $number .= "$hits[1]\n"; 
    $gb .= "$hits[2]\n"; 
    $id .= "$hits[3]\n"; 
    $name .= "$hits[4]\n"; 
} 

my @gi = split('\n', $gi); 
my @number = split('\n', $number); 
my @gb = split('\n', $gb); 
my @id = split('\n', $id); 
my @name = split('\n', $name); 

现在每个标题的每个部分(包含在$hits中)是单个数组中的一个元素。接下来我要做的是打印每个阵列的每个元素,以便我可以为每个阵列生成元素[0]的列表,每个阵列的元素[1] ...

我不确定这是否需要散列哈希或数组数组。

我对perl相当陌生,所以任何建议都会大有帮助。

我也知道,上述可能不是实现我想要的最光滑的方式 - 再次,任何意见将是伟大的!

回答

2

$ hit是否包含一个头或多个?如果它只有一个,那么将其分解为变量,您可以执行如下操作:

my ($gi, $number, $gb, $id, $name) = split(/\|/, $hits); 

并且每个变量都将包含相应的值。

如果$ hits包含多个标题,那么首先只是分割线,然后在循环中分割每个标题。下面是一个例子,结果将是散列的数组:

my @hits = split(/\n/, $hits); 
my @result; 
for my hit (@hits) { 
    my ($gi, $number, $gb, $id, $name) = split(/\|/, $hits); 
    push(@result, { 
     gi => $gi, 
     number => $number, 
     gb => $gb, 
     id => $id, 
     name => $name, 
    }); 
} 

当然的示例不包括任何错误校验(?比如 - 不头字符串真正相匹配的格式或没有),但你应该包括他们在实际应用中,如果需要的话。

PS:我觉得你真的要开始that

+0

嗨,谢谢你的回答。 $ hits包含多个由\ n分隔的标头 – fugu 2013-04-24 11:35:59

+0

我更新了该帖子,并附上了该案例。 – 2013-04-24 12:10:28

+0

好的 - 我会玩一玩。感谢您的有用链接呢! – fugu 2013-04-24 16:27:07

1

一般来说,数组是同质的数据(“一堆东西”),而散列是异构数据(“名称,数量,和一个生日“)。如果你的数据自然地分裂成一堆内部异构的东西(“一堆个人信息记录,每一个都有一个名字,一个数字和一个生日)”,那么自然数据结构就是一系列hashrefs(参见注释#1)。

就你的情况而言,$hits是一个标题列表。所以我们将创建一个数组,将其称为@headers,其中的每个元素都是表示为散列引用的单个标头。我们可以把分隔的字符串到一个列表与split,我们可以把一个类型的列表到另一种map

my @headers = map { 
    make_header_hashref($_) 
} split(/\n/, $hits); 

sub make_header_hashref { 
    my ($header_string) = @_; 
    my ($gi, $number, $gb, $id, $name) = split(/\|/, $header_string); 

    return { 
     gi  => $gi, 
     number => $number, 
     gb  => $gb, 
     id  => $id, 
     name => $name, 
    }; 
} 

(我拆头字符串转化为hashref头成子,因为 (一)这就是你在实际代码中所做的事情;(b)它阐明了 的结构map。)

您现在有一个hashrefs数组,因此您可以遍历它们,否则将头作为单位处理,而不是作为 属性的集合处理。

笔记#1:嗯,我们真的需要一个描述关联的对象,实现为表示记录的对象数组。

相关问题