Arrays Perl:为DNA序列的对数赔率分数创建和操作数组散列

Arrays Perl:为DNA序列的对数赔率分数创建和操作数组散列,arrays,perl,hash,Arrays,Perl,Hash,又是我。我在创建数组散列时遇到困难,即使在查看文档之后也是如此。我希望HoA包含DNA序列中一个基序(较小序列)的对数优势分数。我希望结构看起来像: $HoA{$id}[$pos] = #score based on the position 其中,$id是序列id,$pos是序列中基序开始的位置。我输入一个包含DNA序列的.txt文件,其格式如下: >Sequence_1 TCAGAACCAGTTATAAATTTATCATTTCCTTCTCCACTCCT >Sequence_2

又是我。我在创建数组散列时遇到困难,即使在查看文档之后也是如此。我希望HoA包含DNA序列中一个基序(较小序列)的对数优势分数。我希望结构看起来像:

$HoA{$id}[$pos] = #score based on the position
其中,
$id
是序列id,
$pos
是序列中基序开始的位置。我输入一个包含DNA序列的.txt文件,其格式如下:

>Sequence_1
TCAGAACCAGTTATAAATTTATCATTTCCTTCTCCACTCCT
>Sequence_2
CCCACGCAGCCGCCCTCCTCCCCGGTCACTGACTGGTCCTG
>Sequence_3
TCGACCCTCTGGAACCTATCAGGGACCACAGTCAGCCAGGCAAG
例如:序列1的位置2处的基序为“AGA”。 下面是我到目前为止的代码(简化了一点):


因此,序列1中从位置2开始的图案“AGA”的对数赔率得分为0.6。我感谢你的耐心和帮助!如果我需要澄清任何事情,请告诉我。

我发现您的代码中存在一些问题。请考虑以下几行:

$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
的条目。但是,您使用的是
=
运算符(附加字符串),而不是使用良好的旧
=
符号。我不认为这是你想要的,所以考虑改变<代码> .= <代码>只是<代码> = ./P> (或者您可能打算改用
/=
。这样,如果
%loscore
%maxscore
已经有
$id
项,它不会被覆盖。但只有您可以确定是否打算使用
/=
运算符。)

现在让我们看看
$loscore{$id}=0
。这告诉我们,
%loscore
是一个散列(或“关联数组”),对于每个条目,键采用$id,值采用数字

但是,在代码的更深处,您有:

@{ $loscore{$id} } = @arr;
$loscore{$id}
${…}
包装的事实告诉我们,
%loscore
中的值是数组引用。但我们已经在上面确定了它的值是数字

由于将数字视为数组引用,Perl将其视为错误

你可能想写的是:

@{ $HoA{$id} } = @arr;

由于
%HoA
散列的值包含数组引用,因此有必要将其作为数组取消引用。

我在代码中看到一些问题。请考虑以下几行:

$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
的条目。但是,您使用的是
=
运算符(附加字符串),而不是使用良好的旧
=
符号。我不认为这是你想要的,所以考虑改变<代码> .= <代码>只是<代码> = ./P> (或者您可能打算改用
/=
。这样,如果
%loscore
%maxscore
已经有
$id
项,它不会被覆盖。但只有您可以确定是否打算使用
/=
运算符。)

现在让我们看看
$loscore{$id}=0
。这告诉我们,
%loscore
是一个散列(或“关联数组”),对于每个条目,键采用$id,值采用数字

但是,在代码的更深处,您有:

@{ $loscore{$id} } = @arr;
$loscore{$id}
${…}
包装的事实告诉我们,
%loscore
中的值是数组引用。但我们已经在上面确定了它的值是数字

由于将数字视为数组引用,Perl将其视为错误

你可能想写的是:

@{ $HoA{$id} } = @arr;

由于
%HoA
散列的值包含数组引用,因此有必要将其作为数组取消引用。

我认为这解决了问题: 替换

$loscore{$id}.=0;
$maxscore{$id}.=-30


如果您有什么需要补充的,请告诉我。

我认为这解决了问题: 替换

$loscore{$id}.=0;
$maxscore{$id}.=-30


如果您有什么要补充的,请告诉我。

第75行是哪一行?该行表示:
@{$loscore{$id}=@arr
在您拥有
$loscore{$id}之前抛出错误。=0在字符串中附加一个数字有点奇怪-我本应该使用
“0”
,但perl将对其进行转换以使其正常工作。但关键位是
%loscore
保存字符串,而不是数组引用。因此出现了这个错误。第75行是哪一行?该行表示:
@{$loscore{$id}}=@arr
在您拥有
$loscore{$id}之前抛出错误。=0在字符串中附加一个数字有点奇怪-我本应该使用
“0”
,但perl将对其进行转换以使其正常工作。但关键位是
%loscore
保存字符串,而不是数组引用。这就是错误所在。我感谢你的帮助!再看一遍之后,我想使用三个数组散列:
%HoA、%loscore、%maxscore
。如果我希望
%loscore
中的每个初始值为
0
%maxscore
中的每个初始值为
-30
,你对创建这两个数组散列有什么建议吗?我目前正在尝试
map
这样做。如果你想将
%loscore
%maxscore
的每个条目初始化为0和-30,那么它们必然不能是“数组散列”。相反,它们将是“数字散列”。换句话说,如果有一个散列将数组引用作为值保存(使其成为“数组散列”),则不能将数字作为值保存。可能您的意图是将
%loscore
初始化为
$loscore{$id}=[0]。这样一来,
%loscore
确实是一个“数组散列”,数组将数字作为其元素你想写
push@{$loscore