Regex 使用从字符串中的点之间选择的键和值创建哈希
我从下面的代码中得到以下结果 例如,$seq设置为aaagacgtcaaagaattcaaaagacgtcaa时: 虽然这与我想要实现的非常接近,但我真正想要做的是使用一个参考酶列表-我在下面的示例中将其存储为哈希键AatII和EcoRI in%RE-以便在$seq序列字符串中找到最佳剪切位点,并将结果存储在数据结构(如哈希)中 剪切位点选择是根据哈希中每个参考酶键的相关酶字符串值进行的。在下面的代码中,键AatII设置为值GACGTC 5;它将在第五个位置后切断GACGTC:GACGT | C;而EcoRI=>GAATTC 1在第一个位置G | AATTC之后拆分序列GAATTC。因此,对于散列中的每个酶键,我根据该键的关联字符串在序列$seq中找到一个位点,并从键的散列值中与该字符串关联的数字中找到一个剪切位点。数字是指酶串位置1之后的切割位置 对于序列$seq,结果将是:aaagacgtcaaagaattcaaagacgtcaa此处括号用于显示切割点。管柱中切割点的位置如下所示:Regex 使用从字符串中的点之间选择的键和值创建哈希,regex,perl,data-structures,hash,bioinformatics,Regex,Perl,Data Structures,Hash,Bioinformatics,我从下面的代码中得到以下结果 例如,$seq设置为aaagacgtcaaagaattcaaaagacgtcaa时: 虽然这与我想要实现的非常接近,但我真正想要做的是使用一个参考酶列表-我在下面的示例中将其存储为哈希键AatII和EcoRI in%RE-以便在$seq序列字符串中找到最佳剪切位点,并将结果存储在数据结构(如哈希)中 剪切位点选择是根据哈希中每个参考酶键的相关酶字符串值进行的。在下面的代码中,键AatII设置为值GACGTC 5;它将在第五个位置后切断GACGTC:GACGT | C
0------8 9---13 14----------26 27--30
这是基于使用EcoRI和AatII选择酶序列并切割完整序列的脚本运行的:aaaGACGT-CaaaG aattcaagagat-Caaa
我想让我的脚本用{0=>8,9=>13,14=>26,27=>30}等键/值将每次运行的结果存储在散列中。通过在每次迭代后对我的键和值进行排序;然后使用二进制搜索查找最近的前一个剪切点,并在当前迭代中添加1作为$end的值。哈希中的条目应与剪切点的数量相同
我不知道这是否可能。如果是的话,有人能给我指出正确的方向,告诉我如何帮助我转换代码来解决这个问题吗
#!/usr/bin/perl
use warnings;
use strict;
my %RE =( 'AatII' => 'GACGTC 5', 'EcoRI' => 'GAATTC 1' );
my $input='';
my @matches =();
my @enz = keys %RE;
my @value = values %RE;
print "Seq:";
my $seq = <STDIN>;
chomp $seq;
print "OK \n";
while ($input ne 'quit') {
print "RE:";
$input = <STDIN>;
chomp $input;
foreach (@enz) {
if ($input =~ /$_/) {
#print "Key:", $_," Value:", $RE{$_};
my @seqval = $seq;
my $val = $RE{$_};
my $real = substr($val, 0, -2);
#my $cut = substr($val, 0, (length($val)-3));
my $cut = chop $val;
my $length = length ($real);
my $mew = substr ($real, 0, $cut);
my $two = substr ($real, -1, ($length-$cut));
#my $push = push @valval;
#chomp %RE{$_};
while ($seq =~ /($real)/g) {
my $match = $1;
#print "$match", "\n";
my $length = length($&);
#print "$length", "\n";
my $pos = length($`);
#print "$pos", "\n";
my $start = $pos + 1;
#print "$start", "\n";
my $end = $pos + $length;
#print "$end", "\n";
my $hitpos = "$start-$end";
#print "$hitpos", "\n";
push @matches, "$match found at $hitpos ";
#print "\tfound:", "\n","\n";
#print "\t\t\t$1$mew", "\n";
#print "\t\t\t$two$3", "\n";
#print "next restriction enzyme:","\n";
} print "$_\n" foreach @matches;
}
}
}
嗨,Khuram,欢迎来到Stackoverflow:- 看起来您可能已经放弃了您的问题,但我添加此答案是为了使其更加完整,并对其他找到它的人可能有用。正如@mappec所建议的,您应该在网站上查找更多资源 虽然可能有更简单的方法可以做到这一点,但我喜欢您创建散列来存储剪切站点的想法,因为它利用了perl的一个强大功能:动态创建任意复杂数据结构的能力。这就是说,有时将数据取回会很复杂!:- 正如@user1937198所指出的,散列是无序的,因此,如果您希望您的输出保留酶字符串在序列中的顺序/位置,那么您不仅需要按其键对散列进行排序,还需要创建可排序键。在您的问题中,您的示例输出显示在4-9处。。。22-27,和。。。13-18由于您没有已排序的数据结构,因此出现故障。修理那部分不太难。为了证明这一点,以下是您的脚本,其中删除了一些print语句,并将$seq序列字符串处理为一个名为%cutting的散列,该散列按其键排序,但请记住,顺序不会保留: AatII酶切位点围绕第一个EcoRI参考酶正确排序。如果您想在执行过程中查看has的外观,可以使用Data::Dumper或Data::Printer(也称为DDP)在程序在结束块中退出时转储哈希: 这将表明:
{
9 {
AatII "GACGTC found at 4..9 "
},
18 {
EcoRI "GAATTC found at 13..18 "
},
27 {
AatII "GACGTC found at 22..27 "
}
}
NB:我只是重复使用了你的代码来做这件事,所以你大部分时间都是这样做的。我不是一个遗传学家,所以如果酶串做了重叠之类的事情,可能仍然会有问题?。在您的代码中有很多变量名需要跟踪,而且可能有一种方法可以将事情重构得更简单或更优雅—这是我留给您和其他贡献者的一个练习:-如果您经常使用perl,您会很快掌握它
嗯。祝您的项目好运。好的起点:您无法对哈希键进行排序。您将需要一个数组。我不确定我是否完全理解您希望在结果中包含的内容:您是否想要一个具有键0和值8{0=>8,…}等的哈希?您可能会发现可以作为捷径使用DDP;用于探索您创建的数据结构。
#!/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
END {
use DDP;
p %cuttings ;
}
{
9 {
AatII "GACGTC found at 4..9 "
},
18 {
EcoRI "GAATTC found at 13..18 "
},
27 {
AatII "GACGTC found at 22..27 "
}
}