2

vcakeから特定の Perl コードを理解しようとしています。通常、私は Perl で自分の道を見つけますが、次のステートメントは私を困惑させます。これは単なるエラーだと思いますが、完全にはわかりません。ステートメントは次のとおりです。

foreach my $seq (keys %$set) {
    if( (defined $set->{$seq}) and (my $numReads >= ($coverage)) ) {
        do something;
    }
    ...
}

$coverageファイルの先頭でスカラー整数 (たとえば 10) として定義されており、再度書き込まれることはありません。$numReadsは上記の行でのみ使用され、他の場所では使用されません!

$set一方、ループ内で変更されるため、条件の最初の部分は完全に理にかなっています。私が理解していないのは2番目の部分です。なぜなら、これは常に同じ値に評価され、or hereの意味を理解していない$numReads>=からです。誰かが私を啓発してもらえますか?おそらく目に見えない自動変数が関係していますか?

4

2 に答える 2

16

my $numReadsforeach手段:ループのコンテキスト内で新しいローカル変数を作成します。その初期値はundefで、数値コンテキストでは として扱われ0ます。したがって、コードは次のようになります。

if ((...) and (0 >= ($coverage)) ) {
}

これは、$coverage が 0 以下に設定されていない限り、「何かを行う」が実行されないことを意味します。

これがデバッグ コードである場合、このステートメントを有効/無効にするために $coverage が使用されていると思います。

私の推測では、あなたはバグを見つけました。

于 2008-12-01T16:54:01.333 に答える
4

また、$set が %set への参照、または %set の構造を模倣するその他のハッシュでない限り、次の行は次のようになります。

foreach my $seq (keys %set)

条件に合わない

defined $set->{$seq}

$set->{$seq} はハッシュ参照を逆参照するため、%set はハッシュです。これは、誰かがハッシュ %set とスカラー $set の両方を hashref でインスタンス化したというよりも、2 番目のバグである可能性が高いです。

于 2008-12-02T10:51:55.650 に答える