【问题标题】:perl subroutineperl 子程序
【发布时间】:2011-12-22 18:44:24
【问题描述】:

我在执行我的 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 没有任何反应。 任何想法为什么只有一部分功能正在执行? 谢谢

【问题讨论】:

  • 你没有正确缩进你的代码,使用大量(仅?)全局变量,不必要地重复代码并且没有很好地使用逻辑(例如if (/^&gt;/) .... if (!/^&gt;/)真的是if (...) else .) 如果您没有使用严格和警告,我强烈建议您这样做。
  • 嗨,相反,代码中的缩进是完美的,我在这里发布时无法掌握它。同意冗余,我已经更正了。我不会使用太多的严格,诊断和警告对我来说始终是必须的。
  • 我不确定您所说的“过于严格”是什么意思,但我认为您是在说您不使用它,这是一个很大的错误。使用 strict 实际上可以节省时间和精力。
  • 是的,你是对的。我不使用严格。作为一个好习惯,我应该使用它,但到目前为止,我已经尽力正确使用名称并注意变量的范围。但可能是我应该开始使用严格的时候了,因为代码行不断增加......
  • 不是重复的文字值,而是定义一个常量或变量并使用它;例如$primer_1 = q(Primer1)。养成总是使用严格编译指示的习惯。您将在减少调试时间、修复“愚蠢”错误方面获得丰厚回报。

标签: perl subroutine


【解决方案1】:

字符[] 是正则表达式中的特殊字符。您需要通过编写CCGTCAATTC\[AC\] 在子入门中转义它们,或者简单地使用eq 字符串比较。照原样,您的第二个 if 失败了,因为您的底漆中的文字 [[AC] 字符类不匹配。

【讨论】:

  • 太棒了……我也想到了这一点……我做到了。但是,文件已创建,但其中没有数据。
  • 您还可以使用\Q .. \E 匹配正则表达式中的文字字符。例如。 /\QCCGTCAATTC[AC]\E/
  • 好的。解决了问题。我没有打开要再次读取的文件。打开文件的调用只进行了一次。感谢您对正则表达式的帮助。必须赞赏。
【解决方案2】:

一般建议:

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

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

    而不是

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

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

  3. 推荐Lexical filehandles
  4. 不要使用 & 号来调用您的函数。

【讨论】:

    猜你喜欢
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2015-12-12
    • 2013-12-27
    相关资源
    最近更新 更多