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