Macos Mac而非Windows或Linux上的perl大型IO错误(添加了不能选择的换行符)

Macos Mac而非Windows或Linux上的perl大型IO错误(添加了不能选择的换行符),macos,perl,newline,large-files,chomp,Macos,Perl,Newline,Large Files,Chomp,我已经在十几台Windows机器、六台Mac和一台Linux机器上测试了我的程序,它在Windows和Linux上都能正常工作,但在Mac上却不能。我的程序设计用于处理蛋白质数据库文件,这些文件是从250MB到10GB的文本文件。我用250MB文件的十分之一制作了一个用于调试的示例文件,但发现较小的文件没有出现错误 我已经将错误缩小到了这段代码,在这段代码中,$tempFile,是蛋白质数据库文件: open(ps_file, "..".$slash."dataset".$slash.$temp

我已经在十几台Windows机器、六台Mac和一台Linux机器上测试了我的程序,它在Windows和Linux上都能正常工作,但在Mac上却不能。我的程序设计用于处理蛋白质数据库文件,这些文件是从250MB到10GB的文本文件。我用250MB文件的十分之一制作了一个用于调试的示例文件,但发现较小的文件没有出现错误

我已经将错误缩小到了这段代码,在这段代码中,
$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);
    }
}
open(ps_文件,“..”$slash.“数据集”$slash.$tempFile)
或者死亡“无法打开$tempFile”;
while(){
咀嚼;
my@curLine=split(/\t/,$);
我的$filter=1;
if(税种){
chomp($curLine[2]);
打印“line2”。$curLine[2]。”,\t.“$taxR{$curLine[2]}。”\n”;
$filter=$taxR{$curLine[2]};
}
如果($filter){
checkSeq(@curLine);
}
}
这是打印语句输出的屏幕截图,显示特殊字符:

这是Windows计算机上的输出外观:

下面是$temp文件中1行的示例


>sp | P48255 | ABCX | CYAPA可能的ATP依赖性转运体ycf16 OS=Cynophora paradoxa GN=ycf16 PE=3 SV=1MSTEKTKILEVKNLKAQVDGTEILKGVNLTINGHAIGPNGSGKSTFKILAGHPAYQVTGGEGILFKNLLELEPEARAGVFNIDFRLLAYNNRRKEELDELPLTFYSIVEKLNVKMDPFLNRNGEGFNGGEKRNEILQMALLNPLAILDTSGLDALIDALRIVAEGVNQLSENSILITYQRLLDYIVYHVMQIGLKRELAKELYGYDWELENKK CYAPA
问题可能在于行尾不一致。如果,正如我所怀疑的那样,尾随空格并不重要,那么最好删除它,而不是
chomp
ing

另请注意:

  • 裸字文件句柄,如
    ps_file
    是在一定距离内受操作的包全局变量,请使用词法文件句柄

  • 使用
    File::Spec
    Path::Class
    以独立于平台的方式处理文件路径

  • 如果打开文件时出错,请包含完整文件路径和错误消息

  • chomp;
    
    my @curLine = split(/\t/, $_);
    my $filter = 1;
    if($taxon){
        chomp($curLine[2]);
    
$curLine[2]
来自一个作为行读入的字符串,并且
chomp
ed。我不明白您为什么要再次咀嚼它

以下是您的代码片段的整理版本:

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);
    }
}
use File::Spec::Functions qw(catfile);
我的$input_file=catfile(“..”,数据集=>$tempFile);

打开我的$ps_文件,用250MB的文件修复了它。我现在要用10GB的文件测试它,但这需要30分钟才能运行。非常感谢