为 DNA 序列创建数组哈希,Perl
Creating a hash of arrays for DNA sequences, Perl
我有一个名为 %id2seq
的散列,其中包含由键 $id
引用的 DNA 序列字符串。我希望能够通过使用字符串中的某个位置作为参考来操纵 DNA 序列。例如,如果我的 DNA 序列是 ACGTG
,我的 $id
将是 Sequence 1
,我的 $id2seq{'Sequence 1'}
将是 ACGTG
,而我的 "theoretical" $id2seq{'Sequence 1'}[3]
将是 G
。
我试图创建一个数组散列来执行此操作,但我得到了一个奇怪的输出(见下面的输出)。我很确定这只是我的格式任何输入都是有帮助的,我提前表示感谢。
这是输入文件的片段:
>Sequence 1
TCAGAACCAGTTATAAATTTATCATTTCCTTCTCCACTCCT
>Sequence 2
CCCACGCAGCCGCCCTCCTCCCCGGTCACTGACTGGTCCTG
>Sequence 3
TCGACCCTCTGGAACCTATCAGGGACCACAGTCAGCCAGGCAAG
这是我目前尝试的片段。 (我有一个哈希 table 可以访问一个 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 = ;
}
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
@seqs
包含最后一个序列中的字符。 $id2seq{$id}[@seqs]
实际上意味着 $id2seq{$id}[N]
其中 N
是最后一个序列的长度。因此,您只打印每个序列中的一个字符,如果该序列比最后一个字符短,则会收到警告。
如果您 print
只是为了调试,使用它会更容易:
use Data::Dumper;
print Dumper(\%id2seq);
否则你必须在嵌套循环中自己迭代 $id2seq{$id}
。
此行不正确:
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 = ;
} 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
您需要打印
$id2seq{$id}[3]\n\n";
获取第四个值。此外,您从未使用 'my' 定义 @seqs 如此严格并且警告是抱怨,因此 'Use of unitialized value in concatenation (.) or string at line 37.'。删除 warnings/strict 或定义 @seqs
我有一个名为 %id2seq
的散列,其中包含由键 $id
引用的 DNA 序列字符串。我希望能够通过使用字符串中的某个位置作为参考来操纵 DNA 序列。例如,如果我的 DNA 序列是 ACGTG
,我的 $id
将是 Sequence 1
,我的 $id2seq{'Sequence 1'}
将是 ACGTG
,而我的 "theoretical" $id2seq{'Sequence 1'}[3]
将是 G
。
我试图创建一个数组散列来执行此操作,但我得到了一个奇怪的输出(见下面的输出)。我很确定这只是我的格式任何输入都是有帮助的,我提前表示感谢。
这是输入文件的片段:
>Sequence 1
TCAGAACCAGTTATAAATTTATCATTTCCTTCTCCACTCCT
>Sequence 2
CCCACGCAGCCGCCCTCCTCCCCGGTCACTGACTGGTCCTG
>Sequence 3
TCGACCCTCTGGAACCTATCAGGGACCACAGTCAGCCAGGCAAG
这是我目前尝试的片段。 (我有一个哈希 table 可以访问一个 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 = ;
}
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
@seqs
包含最后一个序列中的字符。 $id2seq{$id}[@seqs]
实际上意味着 $id2seq{$id}[N]
其中 N
是最后一个序列的长度。因此,您只打印每个序列中的一个字符,如果该序列比最后一个字符短,则会收到警告。
如果您 print
只是为了调试,使用它会更容易:
use Data::Dumper;
print Dumper(\%id2seq);
否则你必须在嵌套循环中自己迭代 $id2seq{$id}
。
此行不正确:
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 = ;
} 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
您需要打印
$id2seq{$id}[3]\n\n";
获取第四个值。此外,您从未使用 'my' 定义 @seqs 如此严格并且警告是抱怨,因此 'Use of unitialized value in concatenation (.) or string at line 37.'。删除 warnings/strict 或定义 @seqs