使用从字符串中的点之间选择的键和值创建哈希

时间:2014-11-17 11:10:43

标签: regex perl data-structures hash bioinformatics

我从下面的代码中得到以下结果。

例如,将$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

1 个答案:

答案 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参考酶。如果你想看到它的样子,你可以使用EcoRIData::Dumper(也称为Data::Printer)在程序退出时DDP转储哈希值1}}阻止:

END

这将显示以下内容:

 END {
    use DDP;
   p %cuttings ;                              
 }  

NB :我只是重复使用您的代码来执行此操作,因此您可以尽可能地使用它。我不是遗传学家,所以如果酶串做重叠之类的事情可能仍有问题(他们这样做吗?)。在你的代码中有许多变量名称需要跟踪,并且可能有一种方法可以将事情重构为更简单或更优雅 - 我将此作为练习留给你和其他贡献者:-)如果你经常使用perl你会非常快速地获得它。

HTH。祝你的项目好运。