我的脚本应该执行以下操作。它需要一个旧的标量列表,并创建一个新的、相应的数字列表。旧列表称为@oldMarkers,新列表称为@newMarkers。
示例输入如下: chr1, chr2, IMP, chr3, IMP, IMP, IMP, chr4
示例输出如下:1, 2, 2.1, 3, 3.1, 3.2, 3.3, 4
脚本的重点是读取@oldMarkers 列表并输出一个列表,其中对于包含字母“chr”的元素的每个实例,一个整数被推入数组@newMarkers。对于@oldMarkers 中的每个IMP 实例,都会将一个十进制数添加到@newMarkers。新的十进制数与前一个数字具有相同的“基本整数”,但添加了 0.1。换句话说,“IMP”的多个后续实例应该与最近读取的“chr”条目具有相同的整数,并附加一个十进制值,用于计算与该最近“chr”相对应的 IMP 的数量入口。
下面的脚本几乎可以 100% 工作。它甚至通常在以下情况下工作。在@oldMarkers 的某些地方,有许多 IMP 条目。当一行中有超过 10 个 IMP 时,代码应该将值推送到 @newMarkers 以便该条目块的所有“IMP”具有相同的整数,这也与对应于最近的数字匹配在@oldMarkers 中读取“chr”的实例。对该整数加 0.1。当小数点的值达到 0.9 时,小数点“重新开始”回到 .1 并从那里上升,直到 IMP 条目的结束。
例如,如果 @oldMarkers 有 13 个“IMP”块并且是:
chr1, chr2, IMP, IMP, IMP, IMP, IMP, IMP, IMP, IMP, IMP, IMP, IMP, IMP, IMP, chr2
那么@newMarkers 应该是:
1, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 2.1, 2.2, 2.3, 2.4, 3
脚本摘要:
原始文件包含多行两个元素。第一个元素并不重要,因此在代码中被跳过。每行的第二个元素是一个 ID,类似于“chr4”或“IMP”。循环读取每一行,将while
第二个元素添加到数组@oldMarkers。
然后,逐项读取该数组。该脚本首先询问@newMarkers 中的条目是否对应于原始@oldMarker 列表中的“chr”或“IMP”。这是通过第一个if
和else
设置完成的。
接下来,对于这两个条件,进一步询问该条目是否来自对应于“chr”或“IMP”条目的数字本身。这是在第一个这样的集合中使用嵌入if
和else
集合完成的。
然后根据条件定义新元素并将其推送到@newMarker。
就像我说的,这主要是有效的。然而,有时,当 IMP 的拉伸超过 10 时,脚本不会“回收”小数。相反,它将 .1 添加到前面的值并输入一个新的整数整数。但对于超过 10 的其他拉伸,它工作正常。它与这个“错误”不一致。
你能发现问题吗?
my @oldMarkers = ();
my @newMarkers = ();
while ( my $line = <$FILE> )
{
chomp $line;
my @entries = split( '\t', $line );
push( @oldMarkers, $entries[ 1 ] );
} ### end of while
for ( my $i = 0 ; $i < scalar @oldMarkers ; $i++ )
{
if ( $oldMarkers[ $i ] =~ m/chr/ ) ### is a marker
{
if ( $oldMarkers[ $i - 1 ] =~ m/IMP/ ) ### new marker comes after imputed site
{
push( @newMarkers, int( $newMarkers[ $i - 1 ] ) + 1 );
}
else ### is coming after a marker
{
push( @newMarkers, $newMarkers[ $i - 1 ] + 1 );
}
} ### if
else ### is an imputed site
{
if ( $oldMarkers[ $i - 1 ] =~ m/IMP/ ) ### imputed site is after another imputed site
{
my $value = $newMarkers[ $i - 1 ] - int( $newMarkers[ $i - 1 ] );
if ( $value < .9 )
{
push( @newMarkers, $newMarkers[ $i - 1 ] + .1 );
}
elsif ( $value > .9 )
{
push( @newMarkers, int( $newMarkers[ $i - 1 ] ) + .1 );
}
} ### if
else ### imputed site is after a marker
{
push( @newMarkers, int( $newMarkers[ $i - 1 ] ) + .1 );
}
} ### else
} ### for
print $newMarkerfile join( "\t", @newMarkers);