Perl подпрограмма - PullRequest
       16

Perl подпрограмма

2 голосов
/ 05 ноября 2011

У меня проблемы с выполнением моих подпрограмм на Perl. Вот определение:

sub primer{
     print STDERR "primer is $_[0]\n";
    $primer=$_[0];
   if ($_[0]=~/ATTACCGC/){
           mkdir ("Primer1") || die "Unable to create directory <$!>\n";
           open OUTFILE1,">","Primer1/lt450";
           open OUTFILE2,">","Primer1/no_primer_lt450";
           open REPORT,">","Primer1/Report";
           &primer_analysis('ATTACCGC');}

           if ($_[0]=~/CCGTCAATTC[AC]/){
           mkdir ("Primer2") || die "Unable to create directory <$!>\n";
           open OUTFILE1,">","Primer2/lt450";
           open OUTFILE2,">","Primer2/no_primer_lt450";
            open REPORT,">","Primer2/Report";
           &primer_analysis('CCGTCAATTC[AC]');}

Вот часть другой подпрограммы, которая должна быть вызвана выше:

sub primer_analysis{
     $primer=$_[0];
    while ($line = <INFILE>){
         if ($line =~ /^>/) {
             $header = $line;
            $headcnt++;}
         if ($line !~/^>/){
         $seq = $line;
          chomp($seq);
        if (length($seq)<450 && $seq=~/^$primer/){
            $len_450=length($seq);
            $TB_450=$len_450+$TB_450;
               $cnt450++;
              print OUTFILE1 "$header";
              print OUTFILE1 "$seq\n";}}

И следующее вызывает функцию:

&primer('ATTACCGC');
&primer('CCGTCAATTC[AC]');

проблема в том, что при запуске программы выполняются только Primer1, то есть каталоги и данные создаются правильно, однако с Primer2 ничего не происходит. Есть идеи, почему выполняется только одна часть функции? Спасибо

Ответы [ 2 ]

2 голосов
/ 05 ноября 2011

символы [] являются специальными символами в регулярных выражениях.Вам нужно экранировать их в подпраймере, написав CCGTCAATTC\[AC\], или просто используйте сравнение строк eq.Как и вы, ваш второй if не работает, потому что литерал [ в вашем учебнике не соответствует классу символов [AC].

0 голосов
/ 06 ноября 2011

Общие советы:

  1. Используйте строгое; используйте предупреждения;
  2. Рассмотрите возможность использования сдвига вместо $ _ [0], т.е.

    $primer = shift;
        if $primer =~ /ATTACCGC/){ ..... etc.
    

    вместо

    $primer=$_[0];
        if ($_[0]=~/ATTACCGC/){
    

    ... и затем используйте $ primer вместо $ _ [0] в вашей функции.

  3. Лексические файловые дескрипторы рекомендуются.
  4. Не используйте амперсанд для вызова ваших функций.
...