在Perl中添加默认系统换行符

时间:2015-01-04 07:17:41

标签: linux perl unix dos

当我将文本附加到文件时,我想为文件添加正确的行结尾:对于Unix:"\n"和对于Windows "\r\n"。但是,我找不到一个简单的方法来做到这一点。这是我能想到的最好的:

use strict;
use warnings;
use Devel::CheckOS ();

my $fn = 'file';
open (my $fh, '<', $fn) or die "Could not open file '$fn': $!\n";
my $first_line = <$fh>;
my $len = length $first_line;
my $file_type = "undetermined";
if ($len == 1) {
    $file_type = "Unix" if $first_line eq "\n";
}
if ($len >= 2) {
    if (substr($first_line, $len - 1, 1) eq "\n") {
        if (substr($first_line, $len - 2, 1) eq "\r") {
            $file_type = "DOS";
        } else {
            $file_type = "Unix";
        }
    }
}
close $fh;
if ($file_type eq "undetermined") {
    $file_type = get_system_file_type();
}
print "File type: $file_type.\n";

sub get_system_file_type {
    return Devel::CheckOS::os_is('MicrosoftWindows') ? "DOS" : "Unix"; 
}

是否真的有必要进行所有这些检查?或者有更简单的方法吗?

1 个答案:

答案 0 :(得分:4)

使用:crlf句柄,例如use openuse if

use if ($^O eq "MSWin32") => open qw(IO :crlf :all);

相关文件:

  • PerlIO用于io图层。请注意,此页面指出:
  

如果平台是MS-DOS,并且通常对文本文件执行CRLF到“\ n”翻译,则默认图层为:

     

unix crlf

所以上面的代码应该是多余的,但这就是你要求的。

  • perlvar代表$^O变量。

  • open for open pragma。

  • if用于条件加载模块。