1

我已经在十几台 Windows 机器、六台 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::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);
    }
}
于 2012-06-28T13:46:48.040 回答