我从下面的代码中得到以下结果。
例如,将$seq
设置为aaaGACGTCaaaGAATTCaaaGACGTCaaa
:
RE: AatII
GACGTC found at 4-9
GACGTC found at 22-27
RE: EcoRI
GACGTC found at 4-9
GACGTC found at 22-27
GAATTC found at 13-18
虽然这非常接近我想要实现的目标,但我真正想做的是使用“参考酶”列表 - 我将其存储为哈希键(在AatII
和{{下面的示例中) 1}}在EcoRI
)中 - 为了在%RE
序列字符串中找到最佳剪切网站,并将结果存储在数据结构中,例如哈希。
切割位点选择根据散列中每个参考酶密钥的相关“酶串”值完成。在下面的代码中,密钥$seq
设置为值AatII
;它将在第五个位置后切GACGTC 5
:( GACGTC
);而GACGT|C
在第一个位置(EcoRI => GAATTC 1
)之后拆分序列GAATTC
。因此,对于我的哈希中的每个酶密钥,我基于该密钥的关联字符串在序列G|AATTC
中找到一个站点,并且从密钥的哈希值中与该字符串相关联的数字中找到“切割站点”。数字是指酶串位置“1”后切割的位置。
对于序列$seq
,结果将是:$seq
(此处括号用于显示切割点)。字符串中剪切位置的位置如下:
(aaaGACGT)(CaaaG)(AATTCaaaGACGT)(Caaa)
这是基于使用 0------8 9---13 14----------26 27--30
和EcoRI
的脚本运行来选择酶序列并切断完整序列,留下:AatII
我希望我的脚本能够将每个运行的结果存储在带有键/值的散列中,例如aaaGACGT CaaaG AATTCaaaGACGT Caaa
。在我的密钥上使用{0=>8, 9=>13, 14=>26, 27=>30}
,在每次迭代后使用值 ;然后使用二进制搜索找到最接近的先前cutsite并在当前迭代中将“1”添加为sort
的值,哈希中应该有与cutites一样多的条目。
我不知道这是否可行。如果是,有人可以指出我正确的方向如何任何人可以帮助我转换我的代码,以解决这个问题。
$end
答案 0 :(得分:0)
嗨Khuram欢迎来到Stackoverflow :-)
看起来你可能已经放弃了你的问题,但我添加了这个答案,使其更加完整,并且可能对找到它的其他人有用。正如@mappec建议的那样,您应该咨询Bioperl网站,在那里您可以找到更多资源。
虽然可能有更简单的方法,但我喜欢你创建一个哈希来存储剪切网站的想法很好,因为它利用了perl的一种强大功能:能够创建任意复杂的数据结构飞。也就是说,将数据恢复出来有时会很复杂! : - )
正如@ user1937198所述,哈希无序,因此如果您希望输出保留序列中酶字符串的顺序/位置,您不仅需要对哈希值进行排序通过它的键,你可以创建可排序的键。在您的问题中,您的示例输出显示found at 4-9
,... 22-27
和... 13-18
乱序,因为您没有sort
编辑的数据结构。修复那部分并不太难。为了证明这一点,这里的脚本删除了一些打印语句,并将$seq
序列字符串处理成HoH
(散列的散列){ {1}}按键排序(但请记住,订单不是保留):
%cuttings
输出结果为:
#!/usr/bin/perl
use warnings;
use strict;
my %RE =( 'AatII' => 'GACGTC 5', 'EcoRI' => 'GAATTC 1' );
my %cuttings = ();
my $input='';
my @enz = keys %RE;
print "Seq:";
my $seq = "aaaGACGTCaaaGAATTCaaaGACGTCaaa";
chomp $seq;
print "OK \n";
while ($input ne 'quit') {
print "RE:";
$input = <STDIN>;
chomp $input;
foreach (@enz) {
if ($input =~ /$_/) {
my @seqval = $seq;
my $val = $RE{$_};
my $real = substr($val, 0, -2);
my $cut = chop $val;
my $cutsite = 0 ;
my $length = length ($real);
my $mew = substr ($real, 0, $cut);
my $two = substr ($real, -1, ($length-$cut));
while ($seq =~ /($real)/g) {
my $match = $1;
my $length = length($&);
my $pos = length($`); #`fix SO syntax highlighting :)
my $start = $pos + 1;
my $end = $pos + $length;
my $hitpos = "$start..$end";
my $cutsite = $end ;
${$cuttings{ $cutsite }}{ $input } = "$match at $hitpos ";
}
}
}
foreach my $cutsite (sort { $a <=> $b} keys %cuttings) {
print " $cuttings{$cutsite}{$_}\n" for ( keys %{ $cuttings{$cutsite} } );
}
}
$ ~/tmp/ perl biogenetic.pl
Seq:OK
RE:EcoRI
GAATTC found at 13..18
RE:AatII
GACGTC found at 4..9
GAATTC found at 13..18
GACGTC found at 22..27
RE:quit
酶切位点正确排序&#34;周围&#34;第一个AatII
参考酶。如果你想看到它的样子,你可以使用EcoRI
或Data::Dumper
(也称为Data::Printer
)在程序退出时DDP
转储哈希值1}}阻止:
END
这将显示以下内容:
END {
use DDP;
p %cuttings ;
}
NB :我只是重复使用您的代码来执行此操作,因此您可以尽可能地使用它。我不是遗传学家,所以如果酶串做重叠之类的事情可能仍有问题(他们这样做吗?)。在你的代码中有许多变量名称需要跟踪,并且可能有一种方法可以将事情重构为更简单或更优雅 - 我将此作为练习留给你和其他贡献者:-)如果你经常使用perl你会非常快速地获得它。
HTH。祝你的项目好运。