搜索特定子字符串时字符的简并性

时间:2014-05-01 09:16:14

标签: perl

我有以下脚本在输入字符串(DNA序列)中搜索指定的子字符串。我想知道是否有人可以帮助指定特定字符的简并性。例如,我不是搜索GATC(或任何仅由G&#39,s&#39; s,A&#39;和C&#39;组成的),而是搜索GRTNA,其中R = A < b>或 G,其中N = A,G,C T.我需要能够在脚本中的长列表中指定其中的一些。非常感谢任何帮助或提示!

use warnings;
use strict;

#User Input
my $usage = "Usage (OSX Terminal): perl <$0> <FASTA File> <Results Directory + Filename>\n";

#Reading formatted FASTA/FA files
sub read_fasta {
    my ($in) = @_;
    my $sequence = "";

    while(<$in>) {
        my $line = $_;
        chomp($line);
        if($line =~ /^>/){ next }
        else { $sequence .= $line }
    }
    return(\$sequence);
}

#Scanning for restriction sites and length-output
open(my $in, "<", shift);

open(my $out, ">", shift);

my $DNA = read_fasta($in);

print "DNA is: \n $$DNA \n";
my $len = length($$DNA);
print "\n DNA Length is: $len \n";

my @pats=qw( GTTAAC );

for (@pats) {
    my $m = () = $$DNA =~ /$_/gi;
    print "\n Total DNA matches to $_ are: $m \n";
}

my $pat=join("|",@pats);

my @cutarr = split(/$pat/, $$DNA);

for (@cutarr) {
    my $len = length($_);
    print $out "$len \n";
}
close($out);
close($in);

1 个答案:

答案 0 :(得分:0)

GRTNA将对应于模式G[AG]T[AGCT]A

看起来你可以通过编写

来做到这一点
for (@pats) {
  s/R/[AG]/g;
  s/N/[AGCT]/g;
}

my $pat = join '|', @pats;
my @cutarr = split /$pat/, $$DNA;

但我不确定我是否可以帮助您满足&#34;我需要能够在脚本中的长列表中指定其中的一些&#34; < / em>的。我认为最好将您的序列放在单独的文本文件中,而不是将列表直接嵌入到程序中。

顺便说一下,

更简单
return $sequence

来自read_fasta子程序?返回引用只意味着您必须使用$$DNA在任何地方取消引用它。我建议看起来应该是这样的

sub read_fasta {
  my ($fh) = @_;
  my $sequence;

  while (<$fh>) {
    unless (/^>/) {
      chomp;
      $sequence .= $_;
    }
  }

  return $sequence;
}