1

私は自分のプログラムを12台のWindowsマシン、6台のMac、およびLinuxマシンでテストしましたが、WindowsとLinuxの両方でエラーなしで動作しますが、Macでは動作しません。私のプログラムは、250MBから10GBの範囲のテキストファイルであるタンパク質データベースファイルで動作するように設計されています。デバッグ用のサンプルファイルを作成するために250MBファイルの1/10を使用しましたが、小さいファイルではエラーが発生しなかったことがわかりました。

バグをコードのこのセクションに絞り込みました。このセクション$tempFileでは、タンパク質データベースファイルです。

open(ps_file, "..".$slash."dataset".$slash.$tempFile) 
         or die "couldn't open $tempFile";
while(<ps_file>){
    chomp;


    my @curLine = split(/\t/, $_);
    my $filter = 1;
    if($taxon){
        chomp($curLine[2]);

        print "line2 ".$curLine[2].",\t".$taxR{$curLine[2]}."\n";

        $filter = $taxR{$curLine[2]};
    }
    if($filter){
        checkSeq(@curLine);
    }
}

これは、特殊文字を示すその印刷ステートメントの出力のスクリーンショットです。

特殊文字を示すその印刷ステートメントの出力

これは、Windowsマシンでの出力のようになります。

出力はWindowsマシンのように見えます

これは$tempFileからの1行の例です

>sp|P48255|ABCX_CYAPA Probable ATP-dependent transporter ycf16 OS=Cyanophora paradoxa GN=ycf16 PE=3 SV=1 MSTEKTKILEVKNLKAQVDGTEILKGVNLTINSGEIHAIMGPNGSGKSTFSKILAGHPAYQVTGGEILFKNKNLLELEPEERARAGVFLAFQYPIEIAGVSNIDFLRLAYNNRRKEEGLTELDPLTFYSIVKEKLNVVKMDPHFLNRNVNEGFSGGEKKRNEILQMALLNPSLAILDETDSGLDIDALRIVAEGVNQLSNKENSIILITHYQRLLDYIVPDYIHVMQNGRILKTGGAELAKELEIKGYDWLNELEMVKK CYAPA

4

1 に答える 1

3

問題は、おそらく一貫性のない行末にあります。私が推測するように、末尾の空白が重要ではない場合は、chomping の代わりにそれを削除することをお勧めします。

また、次の点に注意してください。

  • ps_file離れた場所でアクションの対象となるパッケージ グローバル変数などのベアワード ファイルハンドルは、レキシカル ファイルハンドルを使用します。

  • File::Specまたはを使用Path::Classして、プラットフォームに依存しない方法でファイル パスを処理します。

  • ファイルを開くときにエラーが発生した場合は、完全なファイル パスとエラー メッセージを含めます。

  • chomp;
    
    my @curLine = split(/\t/, $_);
    my $filter = 1;
    if($taxon){
        chomp($curLine[2]);
    

$curLine[2]行として読み込まれた文字列とchomped に由来します。なぜあなたがそれをまたむしゃむしゃ食べているのかわかりません。

コードスニペットの整理されたバージョンは次のとおりです。

use File::Spec::Functions qw( catfile );

my $input_file = catfile('..', dataset => $tempFile);


open my $ps_file, '<', $input_file
    or die "couldn't open '$input_file': $!";

while (my $line = <$ps_file>) {
    $line =~ s/\s+\z//; # remove all trailing space

    my @curLine = split /\t/, $line;

    my $filter = 1;
    if ($taxon) {
        my $field = $curLine[2];
        $filter = $taxR{ $field };

        print join("\t", "line2 $field", $filter), "\n";
    }
    if ($filter) {
        checkSeq(@curLine);
    }
}
于 2012-06-28T13:46:48.040 に答える