我应该使用什么数据结构来存储.fasta标头的集合?

时间:2013-04-24 10:41:33

标签: arrays perl hash bioinformatics

我正在尝试编写一个将分割fasta标头的perl程序:

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 个答案:

答案 0 :(得分:2)

$ hits是否包含一个或多个标题?如果它只是一个,那么将它分成变量你可以做类似的事情:

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

开始

答案 1 :(得分:1)

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

在您的情况下,$hits是标题列表。所以我们将创建一个数组,称之为@headers,其中每个元素都是一个表示为hashref的单独标题。我们可以使用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分成了一个sub,因为 (a)这是你在实际代码中所做的事情;(b)它澄清了结构 map。)

现在你有一个hashrefs数组,所以你可以迭代它们 否则将标题作为单位而不是作为集合处理 属性。

注意#1:嗯,我们真的想要一个描述关联的对象,实现为代表记录的对象数组。