Macos Mac而非Windows或Linux上的perl大型IO错误(添加了不能选择的换行符)
我已经在十几台Windows机器、六台Mac和一台Linux机器上测试了我的程序,它在Windows和Linux上都能正常工作,但在Mac上却不能。我的程序设计用于处理蛋白质数据库文件,这些文件是从250MB到10GB的文本文件。我用250MB文件的十分之一制作了一个用于调试的示例文件,但发现较小的文件没有出现错误 我已经将错误缩小到了这段代码,在这段代码中,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
$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分钟才能运行。非常感谢