0

3 つのテキスト ファイルを検索して、4 つの特定の遺伝子名 (に保存されている$var#) のいずれかを探しています。見つかった場合、遺伝子名の後に見つかった値を取得し、カウントに追加します。$count_exp#次に、合計を取得し、すべてのファイル内の出現数で割って値を平均します。

各ファイルに遺伝子名が見つからない場合、ユーザーに知らせる適切な方法は何ですか? このループ/条件のフローを処理するのに問題があります。

3 つのテキスト ファイルの 1 つを処理するコードのスニペットを次に示します。

    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;
    }
}
4

1 に答える 1

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"];
  }
}
于 2013-03-01T15:56:03.677 に答える