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

Will setting $/="\R" allow chomp() to work correctly with most files in perl?

有谁知道设置 $/="\R"; 是否会可靠地让 chomp() 做正确的事情,即删除一行中的任何行尾约定?

具体来说,我 运行 在 Windows 和 UNIX 上编写脚本,并且必须处理来自网络的文件,并且具有未知的行尾约定:MS-DOS、UNIX、 MacOS < 9,随便什么。

我最近偶然发现了“\R”,但我以前没有见过它。我认为这是新的。嗯,比 Perl 5.006 更新。 (已经有一段时间了。)

“\R”声称也可以使用 Unicode 换行符。我无法正确测试它。

谢谢。

-埃里克

我惊讶地发现 Whosebug 中实际上有一个 "newline" 标签。

Will setting $/='\R' allow chomp() to work correctly with most files in perl?

$/ 设置为 '\R' 会将双字符序列 "\R" 视为换行符。
$/ 设置为 "\R" 将导致关于 Unrecognized escape.

的警告

\R 不是字符串,但仅在正则表达式的上下文中才有意义。但是 $/ 的文档明确指出:

Remember: the value of $/ is a string, not a regex. awk has to be better for something. :-)

我刚才开玩笑创建了 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>;
...