代码之家  ›  专栏  ›  技术社区  ›  Erik Bennett

设置$/=“\R”是否允许chomp()正确处理perl中的大多数文件?

  •  4
  • Erik Bennett  · 技术社区  · 8 年前

    $/="\R"; 是否会可靠地让chomp()做正确的事情,即删除行上的任何行尾约定?

    具体来说,我在Windows和UNIX上运行脚本,必须处理来自网络的文件,这些文件具有未知的行尾约定:MS-DOS、UNIX、MacOS<9等等。

    我最近偶然发现了“\R”,但我以前从未见过。我觉得是新的。好吧,比Perl5.006更新。(好久没见了。)

    “\R”还声称可以使用Unicode换行符。我没办法正确测试。

    谢谢。

    -埃里克

    我很惊讶地发现实际上有一个“newline”标签 栈溢出 .

    2 回复  |  直到 8 年前
        1
  •  8
  •   Steffen Ullrich    8 年前

    设置$/='\R'是否允许chomp()正确处理perl中的大多数文件?

    $/ 到 '\R' 会考虑两个字符的序列 "\\R" 作为新线。
    $/ 到 "\R" 将导致有关 Unrecognized escape

    \R 不是字符串,但仅在正则表达式上下文中有意义。但是 明确声明:

    $/ 是字符串,不是正则表达式。awk必须更好。:-)

        2
  •  1
  •   mob    8 年前

    我创造了 Acme::InputRecordSeparatorIsRegexp 前一段时间只是个玩笑,但它确实为限制 $/ 不能是正则表达式。对于0.04版(刚刚上传),你可以说

    use Acme::InputRecordSeparatorIsRegexp ':all';
    
    open my $fh, '<:irs(\R)', 'file-with-ambiguous-line-endings.txt';
    autochomp($fh,1);     # or (tied *$fh)->autochomp(1)
    @lines = <$fh>;
    ...