为DNA序列创建数组哈希,Perl

问题描述 投票:0回答:3

我有一个名为%id2seq的哈希,它包含由密钥$id引用的DNA序列字符串。我希望能够通过使用字符串中的位置作为参考来操纵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
arrays perl hash dna-sequence
3个回答
0
投票

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

如果你print只用于调试它更容易:

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

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


0
投票

这行不正确:

print "$id2seq{$id}[@seqs]\n\n";

$id2seq{$id}是一个数组引用,所以打印它的正确方法是

print "@{ $id2seq{$id} }\n\n";

一个完整的例子是:

#!/usr/bin/perl
use warnings;
use strict;

my $current_id;
my %id2seq;
while (<DATA>) {
    chomp;
    if (/^>(.+)/) {
        $current_id = $1;
    } else {
        $id2seq{$current_id} = [ split(//) ];
    }
}

print "@{ $_ }\n" foreach (values %id2seq);

exit 0;

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

测试运行:

$ perl dummy.pl
T C G A C C C T C T G G A A C C T A T C A G G G A C C A C A G T C A G C C A G G C A A G
C C C A C G C A G C C G C C C T C C T C C C C G G T C A C T G A C T G G T C C T G
T C A G A A C C A G T T A T A A A T T T A T C A T T T C C T T C T C C A C T C C T

-1
投票

你需要打印

$id2seq{$id}[3]\n\n";

获得第四个值。此外,你从来没有用'my'定义@seqs如此严格且警告是抱怨的,因此'连接中使用了单位化值(。)或第37行中的字符串'。删除warnings / strict或定义@seqs

© www.soinside.com 2019 - 2024. All rights reserved.