1

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

这是 Perl 片段,运行在一组配置规范元素上,并将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 分钟的工作...

4

2 回答 2

3

尝试

$fh->binmode;

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

于 2013-07-11T14:43:27.243 回答
1

您正在运行与:crlfWindows 上 Perl 默认的 IO 层发生冲突。您可以binmode在事后使用删除该层,或者您可以使用:raw(*nix 的默认层)或其他一些适当的 IO 层打开文件句柄。

样本:

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

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

于 2013-07-11T15:11:16.953 回答