2012-06-28 18 views
1

我已經在十幾臺Windows機器,六臺Mac機和一臺Linux機器上測試了我的程序, Windows和Linux,但不是Mac。我的程序設計用於處理蛋白質數據庫文件,這些文件的文本文件範圍從250MB到10GB。爲了調試目的,我花了250MB文件的1/10製作一個示例文件,但發現該小文件沒有出現該錯誤。perl在Mac上有很大的IO錯誤,但不是Windows或Linux(增加了換行符不能被刪除)

我已經縮小的bug來的這部分代碼,在本節$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); 
    } 
} 

這是顯示特殊字符的打印語句的輸出的屏幕截圖:

output of that print statement showing special characters

這是輸出看起來像在Windows計算機上:

output looks like on a Windows Machine

下面是從$ TEMPFILE

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

回答

3

的問題可能存在不一致的行結束1線的一個實例。正如我懷疑的那樣,如果尾隨空格並不重要,那麼最好刪除它而不是chomp ing。

還要注意:

  • 裸字的文件句柄如ps_file是包全局變量受到超距作用,使用詞法文件句柄。

  • 使用File::SpecPath::Class以獨立於平臺的方式處理文件路徑。

  • 如果打開文件時出現錯誤,請包含完整的文件路徑和錯誤消息。

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

$curLine[2]來自被讀取在作爲行和chomp編的字符串。我不明白你爲什麼要再次咀嚼。

這裏的收拾你的代碼片段的版本:

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); 
    } 
} 
+0

,與250MB的文件固定它 我打算現在10GB的文件進行測試,但將採取30分鐘運行 謝謝非常 –

相關問題