Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 我应该使用什么数据结构来存储.fasta头的集合?_Arrays_Perl_Hash_Bioinformatics - Fatal编程技术网

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

Arrays 我应该使用什么数据结构来存储.fasta头的集合?,arrays,perl,hash,bioinformatics,Arrays,Perl,Hash,Bioinformatics,我正在尝试编写一个perl程序,该程序将拆分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 =

我正在尝试编写一个perl程序,该程序将拆分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新手,所以任何建议都会非常有用


我也意识到,上述可能不是实现我想要的最巧妙的方式——再说一次,任何评论都会很好

$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:我想你真的必须从

开始一般来说,数组是用于同质数据(“一堆东西”),而散列是用于异质数据(“一个名字、一个数字和一个生日”)。如果您的数据自然地拆分为一组内部异构的内容(“一组个人信息记录,每个记录都有一个名称、一个数字和一个生日”),那么自然的数据结构就是一个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,
    };
}
(我将头字符串到头hashref的转换拆分为一个子字符串,因为 (a) 这就是你在真实代码中要做的,(b)它澄清了
地图

现在您有了一个hashref数组,因此可以遍历它们并 否则,将标题作为单元处理,而不是作为 属性


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

Hi-谢谢您的回答$hits包含多个标题,以\nOK great分隔-我将对此进行一次尝试。谢谢你的帮助链接!我很困惑,你是如何在没有先声明的情况下创建哈希的?在访问$results{go}之前,我不需要声明我的%results吗