1

私は独学で Perl を学んでおり、Perl の専門家からの支援を求めています。

foreachループ内でファイルハンドルを使用できないというエラーが表示され続けますが、確実に使用できますclose(またはundef、両方を試しました)。ここで完全なエラーを参照してください。http://cl.ly/image/2b2D1T403s14

コードは GitHub で入手できます: https://github.com/bsima/yeast-TRX

問題のコードは、ファイル「script.pl」の 90 行付近にあります。

foreach my $species (keys %Saccharomyces) {
    open(RAW,">./data/$species/$geneName/raw.csv");
        print RAW "gene,dinucleotide,position,trx.score,energy.score\n";
    undef RAW; 
    open(SMOOTH,">./data/$species/$geneName/smooth.csv");
        print SMOOTH "gene,position,trx.score,energy.score\n";
    undef SMOOTH;
}

助けていただければ幸いです。Perl がどのようにファイルハンドルを操作するかの複雑さを知りません。おそらく、正式なトレーニングを受けていないためです。誰かが特に役立つと感じている場合は、私の全体的なコード品質に関するコメントも大歓迎です。

編集:問題が見つかりました。Perl はその場でディレクトリを生成できないため、$species/$geneNameディレクトリが作成されることさえありませんでした。foreachループの先頭にmkdir("$species/$geneName");、問題を解決する簡単な行を追加しました。

4

2 に答える 2

6

非常にわかりやすい警告が表示されます。

「strict subs」の使用中はベアワード RAW を使用できません

また、undef FILEHANDLEほど良くありませんclose FILEHANDLE

解決策は、ファイル ハンドルに通常のスコープ変数を使用して、次のように閉じることです。

foreach my $species (keys %Saccharomyces) {
    open my $raw, ">", "./data/$species/$geneName/raw.csv";
    print $raw "gene,dinucleotide,position,trx.score,energy.score\n";
    close $raw;
    open my $smooth, ">", "./data/$species/$geneName/smooth.csv";
    print $smooth "gene,position,trx.score,energy.score\n";
    close $smooth;
}

また、書き込みを試みる前に、$rawとが開かれているかどうかを確認する必要があります。$smooth

于 2013-10-11T03:30:30.753 に答える
0

Perl はその場でディレクトリを生成できないため、$species/$geneNameディレクトリが作成されることさえありませんでした。foreachループの先頭にmkdir("$species/$geneName");、問題を解決する簡単な行を追加しました。

于 2013-10-13T14:36:38.983 に答える