2012-06-28 23 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分钟运行 谢谢非常 –

相关问题