又是我。即使查看文档,我也无法创建数组的哈希。我希望HoA包含DNA序列中基序(较小序列)的对数奇数得分。我希望结构看起来像:
$HoA{$id}[$pos] = #score based on the position
$id
是序列ID,$pos
是序列中基序开始的位置。我输入了一个.txt文件,其中包含如下格式的DNA序列:
>Sequence_1
TCAGAACCAGTTATAAATTTATCATTTCCTTCTCCACTCCT
>Sequence_2
CCCACGCAGCCGCCCTCCTCCCCGGTCACTGACTGGTCCTG
>Sequence_3
TCGACCCTCTGGAACCTATCAGGGACCACAGTCAGCCAGGCAAG
例如:序列1第2位的基元为'AGA'。 下面是我到目前为止的代码(略有简化):
use strict;
use warnings;
use Data::Dumper;
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 %HoA = ();
my %loscore = ();
my $id = '';
open (FILE, '<', $filename1) or die "Cannot open $filename1.",$!;
my $dna;
while (<FILE>)
{
if($_ =~ /^>(.+)/)
{
$id = $1; #Stores 'Sequence 1' as the first $id, etc.
}
else
{
$HoA{$id} = [ split(//) ]; #Splits the contents to allow for position reference later
$loscore{$id} .= 0; #Creates a hash with each id number to have a log-odds score (initial score 0)
$maxscore{$id} .= -30; #Creates a hash with each id number to have a maxscore (initial score -30)
}
}
close FILE;
my $width = 3;
my %logodds; #I know there is a better way to do this - this is just for simplicity
$logodds{'A'}[0] = 0.1;
$logodds{'A'}[1] = 0.2;
$logodds{'A'}[2] = 0.3;
$logodds{'C'}[0] = 0.2;
$logodds{'C'}[1] = 0.5;
$logodds{'C'}[2] = 0.2;
$logodds{'G'}[0] = 0.3;
$logodds{'G'}[1] = 0.2;
$logodds{'G'}[2] = 0.4;
$logodds{'T'}[0] = 0.4;
$logodds{'T'}[1] = 0.1;
$logodds{'T'}[2] = 0.1;
print Dumper (\%logodds);
print "\n\n";
for my $base (qw( A C G T))
{
print "logodds$base @{$logodds{$base}}\n";
}
my @arr;
foreach $id (keys %HoA)
{
for my $pos1 (0..length($HoA{$id})-$width-1) #Look through all positions the motif can start at
{
for my $pos2 ($pos1..$pos1+($width-1)) #look through the positions at a specific motif starting point
{
for my $base (qw( A C G T))
{
if ($HoA{$id}[$pos2] eq $base) #If the character matches a base:
{
for my $pos3 (0..$width-1) #for the length of the motif:
{
$arr[$pos1] += $logodds{$base}[$pos3];
@{ $loscore{$id}} = @arr; #Throws error here
}
}
}
}
}
}
print Dumper(\%loscore);
我不断收到错误消息: 在第75行使用“ strict refs”时,不能使用字符串(“ 0”)作为ARRAY ref。
使用我想要的数据对数得分的示例是:
$HoA{'Sequence 1'}[2] = 0.1 + 0.2 + 0.3 = 0.6
因此,在序列1中的位置2开始的主题'AGA'的log-odds得分是0.6。感谢您的耐心配合和帮助!让我知道是否需要澄清任何事情。
答案 0 :(得分:0)
我在您的代码中看到了一些问题。考虑以下几行:
$HoA{$id} = [ split(//) ]; # Splits the contents to allow for position reference later
$loscore{$id} .= 0; # Creates a hash with each id number to have a log-odds score (initial score 0)
$maxscore{$id} .= -30; # Creates a hash with each id number to have a maxscore (initial score -30)
根据您的评论,您似乎想用0和-30初始化%loscore
和%maxscore
的条目。但是,不是使用旧的=
符号,而是使用.=
运算符(用于附加字符串)。我认为这不是您想要的,因此请考虑将.=
更改为=
。
(或者您可能打算使用//=
。那样,如果%loscore
和%maxscore
已经有一个$id
条目,则不会被覆盖。但是只有您可以确定地说出是否要使用//=
运算符。)
现在让我们看一下$loscore{$id} = 0
。这告诉我们%loscore
是一个哈希(或“关联数组”),对于每个条目,其键值都为$ id,数字为值。
但是,在您的代码中进一步包含以下内容:
@{ $loscore{$id} } = @arr;
$loscore{$id}
由${ ... }
包装的事实告诉我们%loscore
中的值是数组引用。但是我们已经在上面确定了它的值是数字!
由于将数字作为数组引用,Perl认为这是错误。
您可能要写的是:
@{ $HoA{$id} } = @arr;
由于%HoA
散列中的值包含数组引用,因此有必要将 that 作为数组取消引用。
答案 1 :(得分:0)
我认为这可以解决问题: 替换
$loscore{$id} .= 0;
$maxscore{$id} .= -30;
使用
foreach $id (keys %HoA)
{
for my $len (0..(length($HoA{$id})-$width-1))
{
push @{ $loscore{$id} }, 0;
push @{ $maxscore{$id} }, -30;
}
}
让我知道您是否要添加任何内容。