【问题标题】:Using Perl Win7 to write a file for Linux and having only Linux line endings使用 Perl Win7 为 Linux 编写文件并且只有 Linux 行结尾
【发布时间】:2013-07-09 21:34:10
【问题描述】:

此 Perl 脚本在 Win7 上运行,修改了将在 Linux 机器上读取的 Clearcase 配置规范。 Clearcase 对其行结尾非常挑剔,它们必须精确且只有 \n (0x0A) 但是尽我所能尝试我不能让 Perl 只吐出 \n 结尾,它们通常会出现 \r\n (0x0D 0x0A)

这是 Perl sn-p,它运行在一组配置规范元素上,并将 element /somevob/... 位转换为 element /vobs/somevob/... 并打印到文件句柄。

        $fh = new FileHandle;
    foreach my $line (@cs_array)
        {
        $line =~ s/([element|load])(\s+\/)(.+)/$1$2vobs\/$3/g; 
        $line =~ s/[\r\n]/\n/g;  # tried many things here
        $fh->print($line);
        }
    $fh->close();

有时数组中的元素是多行的,由\n分隔

element /vob1/path\nelement\n/vob2/path\nload /vob1/path\n element\n
/vob3/path 
load /vob3/path

当我在二进制查看器中查看在 Win7 上编写的文件时,总是会出现 Linux 上的 Clearcase 抱怨的 0x0D 0x0A 换行序列。这似乎来自印刷品。

有什么建议吗?我以为这将是一个 10 分钟的工作......

【问题讨论】:

  • 您是否尝试过明确指定\x0A 而不是\n? IIRC,\n 是逻辑行尾。
  • @amon 据我所知,在 Perl 中并非如此。 \r\x0d\n\x0a,只是在边界处\r\n\n 之间转换的IO 层。如果有人能证明我错了,我想看看。
  • @hobbs 有道理(我已经有一段时间没有为 Windows 写东西了)。

标签: linux perl file eol


【解决方案1】:

试试

$fh->binmode;

否则您可能处于文本模式,对于 Windows,这意味着 \n 被转换为 \r\n

【讨论】:

    【解决方案2】:

    您的运行违反了:crlf IO 层,这是 Windows 上 Perl 的默认设置。 您可以在删除该层之后使用binmode,或者您可以在第一个位置使用:raw(*nix 的默认层)或其他一些适当的 IO 层打开文件句柄。

    示例:

    $fh = FileHandle->new($FileName, '>:raw')
    

    查看perldoc open 了解有关 IO 层的更多详细信息。

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      相关资源
      最近更新 更多