Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用从字符串中的点之间选择的键和值创建哈希_Regex_Perl_Data Structures_Hash_Bioinformatics - Fatal编程技术网

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

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

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

例如,$seq设置为aaagacgtcaaagaattcaaaagacgtcaa时:

虽然这与我想要实现的非常接近,但我真正想要做的是使用一个参考酶列表-我在下面的示例中将其存储为哈希键AatII和EcoRI in%RE-以便在$seq序列字符串中找到最佳剪切位点,并将结果存储在数据结构(如哈希)中

剪切位点选择是根据哈希中每个参考酶键的相关酶字符串值进行的。在下面的代码中,键AatII设置为值GACGTC 5;它将在第五个位置后切断GACGTC:GACGT | C;而EcoRI=>GAATTC 1在第一个位置G | AATTC之后拆分序列GAATTC。因此,对于散列中的每个酶键,我根据该键的关联字符串在序列$seq中找到一个位点,并从键的散列值中与该字符串关联的数字中找到一个剪切位点。数字是指酶串位置1之后的切割位置

对于序列$seq,结果将是:aaagacgtcaaagaattcaaagacgtcaa此处括号用于显示切割点。管柱中切割点的位置如下所示:

                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 "
    }
}