首页 > 解决方案 > 为 DNA 序列创建数组哈希,Perl

问题描述

我有一个名为的散列%id2seq,其中包含由 key 引用的 DNA 序列字符串$id。我希望能够通过使用字符串中的位置作为参考来操纵 DNA 序列。例如,如果我的 DNA 序列是ACGTG,我$id会是Sequence 1,我$id2seq{'Sequence 1'}会是ACGTG,我的“理论”$id2seq{'Sequence 1'}[3]G。我正在尝试创建一个数组哈希来执行此操作,但我得到了一个奇怪的输出(见下面的输出)。我很确定这只是我的格式任何输入都是有帮助的,我提前感谢。

这是输入文件的片段:

>Sequence 1
TCAGAACCAGTTATAAATTTATCATTTCCTTCTCCACTCCT
>Sequence 2
CCCACGCAGCCGCCCTCCTCCCCGGTCACTGACTGGTCCTG
>Sequence 3
TCGACCCTCTGGAACCTATCAGGGACCACAGTCAGCCAGGCAAG

这是我目前尝试的一个片段。(我有一个哈希表可以访问一个带有注释掉的 DNA 序列的文件):

use strict;
use warnings;

print "Please enter the filename of the fasta sequence data: ";
my $filename1 = <STDIN>;

#Remove newline from file
chomp $filename1;

#Open the file and store each dna seq in hash
my %id2seq = ();
my $id = '';
open (FILE, '<', $filename1) or die "Cannot open $filename1.",$!;
my $dna;
while (<FILE>)
{
    if($_ =~ /^>(.+)/)
    {
        $id = $1;
    }
    else
    {
        ## $id2seq{$id} = $_; used to create hash table
        @seqs = split '', $_;
        $id2seq{$id} = [ @seqs ];
    }
}
close FILE;
foreach $id (keys %id2seq)
{
    print "$id2seq{$id}[@seqs]\n\n";
}

输出

Use of unitialized value in concatenation (.) or string at line 37.


T

G

A

T

T

标签: arraysperlhashdna-sequence

解决方案


@seqs包含最后一个序列中的字符。$id2seq{$id}[@seqs]实际上意味着最后一个序列的长度在$id2seq{$id}[N]哪里。N因此,您只打印每个序列中的一个字符,如果该序列比最后一个短,则会收到警告。

如果您print仅用于调试,则使用以下方法会更容易:

use Data::Dumper;
print Dumper(\%id2seq);

$id2seq{$id}否则,您必须在嵌套循环中迭代自己。


推荐阅读