【问题标题】:What data structure should I use to store a collection of .fasta headers?我应该使用什么数据结构来存储 .fasta 标头的集合?
【发布时间】:2013-04-17 21:06:00
【问题描述】:

我正在尝试编写一个将拆分 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 还很陌生,所以任何建议都会很有帮助。

我也知道,上述方法可能不是实现我想要的最巧妙的方法 - 任何 cmets 都会很棒!

【问题讨论】:

    标签: arrays perl hash bioinformatics


    【解决方案1】:

    $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开始

    【讨论】:

    • 嗨 - 感谢您的回答。 $hits 包含由 \n 分隔的多个标题
    • 好的,太好了——我会玩一下。也感谢您提供有用的链接!
    • 我很困惑你是如何在没有首先声明的情况下创建哈希的?我不需要在访问 $results{go} 之前声明我的 %results
    【解决方案2】:

    一般来说,数组用于同质数据(“一堆东西”),而哈希用于异构数据(“姓名、数字和生日”)。如果你的数据自然分裂成一堆内部异构的东西(“一堆个人信息记录,每条都有名字、数字和生日”),那么自然的数据结构就是一个 hashref 数组(见注#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,
        };
    }
    

    (我将header string到header hashref的转换拆分为一个sub,因为 (a)这就是你在真实代码中所做的,(b)它阐明了 map.)

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-21
      • 2015-11-30
      • 1970-01-01
      • 2019-10-12
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多