没有找到变量的正确循环/条件选项是什么?

时间:2013-03-01 15:40:25

标签: perl bioinformatics

我在三个文本文件中搜索四个特定基因名称之一(存储在$var#中)。找到它后,它会获取基因名称后面的值并将其添加到计数中。然后,我们通过取总计$count_exp#并除以所有文件中的出现次数来平均该值。

在每个文件中找不到基因名称时,让用户知道的正确方法是什么?我在处理这个循环/条件的流程时遇到了困难。

以下是处理三个文本文件之一的代码片段....

    foreach $hyperosmotic(@hyperosmotic)
{
    @hyperosmotic1=split(/\t/,$hyperosmotic);
    $name=$hyperosmotic1[0];
    $exp=$hyperosmotic1[1];
    chomp $name;
    chomp $exp;
    if ($name eq $var1)
    {
    $count_exp1 = $count_exp1 + $exp;       
    $count_var1 = ++$count_var1;    
    }
    elsif ($name eq $var2)
    {
    $count_exp2 = $count_exp2 + $exp;
    $count_var2 = ++$count_var2;    
    }
    elsif ($name eq $var3)
    {
    $count_exp3 = $count_exp3 + $exp;
    $count_var3 = ++$count_var3;    
    }
    elsif ($name eq $var4)
    {
    $count_exp4 = $count_exp4 + $exp;
    $count_var4 = ++$count_var4;
    }
}

1 个答案:

答案 0 :(得分:3)

你基本上想要使用数组:

(和use strict; use warnings;

my @count_var = (0)x4;
my @count_exp = (0)x4;
my @var = ($var1, $var2, ...);

HYPEROSMOTIC:
for my $hyperosmotic (@hyperosmotic) {

    my ($name, $exp) = split /\t/, $hyperosmotic;

    for my $i (0 .. $#var) {
      if ($name eq $var[$i]) {
        $count_exp[$i] += $exp;
        $count_var[$i]++;
        next HYPEROSMOTIC; # jump into next iteration of the labeled loop
      }
    }

    # this code is only reached if no var matched:
    die qq[I don't have a var for name "$name"];
    # That just threw a fatal error. You may want to do something different.
}

您可以使用哈希来提高效率:

my %counts = (
  $var1 => {exp => 0, var => 0},
  $var2 => {exp => 0, var => 0},
  $var3 => {exp => 0, var => 0},
  $var4 => {exp => 0, var => 0},
);

for my $hyperosmotic (@hyperosmotic) {
  my ($name, $exp) = split ...;
  if (my $count = $counts{$name}) {
    $count->{exp} += $exp;
    $count->{var}++;
  } else {
    die qq[I don't have a var for name "$name"];
  }
}