perl子程序

时间:2011-11-05 19:09:39

标签: perl subroutine

我在执行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 个答案:

答案 0 :(得分:2)

字符[]是正则表达式中的特殊字符。您需要通过编写CCGTCAATTC\[AC\]在子引子中转义它们,或者只使用eq字符串比较。因为你的第二篇文章是失败的,因为你的引文中的文字[[AC]字符类不匹配。

答案 1 :(得分:0)

一般建议:

  1. 使用严格;使用警告;
  2. 考虑使用shift而不是$ _ [0],即

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

    而不是

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

    ...然后在你的函数中使用$ primer而不是$ _ [0]。

  3. 建议
  4. Lexical filehandles
  5. 请勿使用&符号来调用您的功能。