Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 将设置为“$/=”\R";是否允许chomp()正确处理perl中的大多数文件?_Regex_Perl_Newline - Fatal编程技术网

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

Regex 将设置为“$/=”\R";是否允许chomp()正确处理perl中的大多数文件?,regex,perl,newline,Regex,Perl,Newline,是否有人确定设置$/=“\R”将可靠地让chomp()做正确的事情,即删除一行中的任何行尾约定 具体来说,我在Windows和UNIX上运行脚本,必须处理来自网络的文件,并且具有未知的终端约定:MS-DOS、UNIX、MacOS代码> $/到 \ R '/COD>将考虑两个字符序列 \\ r \ 为换行符。 将$/设置为“\R”将导致关于无法识别的转义的警告 \R不是字符串,但仅在正则表达式上下文中有意义。但是$/的文档明确指出: 请记住:$/的值是字符串,而不是正则表达式。awk必须做得更好。

是否有人确定设置
$/=“\R”
将可靠地让chomp()做正确的事情,即删除一行中的任何行尾约定

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

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

“\R”也声称使用Unicode换行符。我没有办法正确地测试这个

谢谢

-埃里克

我惊讶地发现stackoverflow中实际上有一个“newline”标记

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

设置>代码> $/到<代码> \ R '/COD>将考虑两个字符序列<代码> \\ r \ <代码>为换行符。 将

$/
设置为
“\R”
将导致关于
无法识别的转义的警告

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

请记住:
$/
的值是字符串,而不是正则表达式。awk必须做得更好。:-)

我在不久前创建了一个笑话,但它确实为
$/
不能是正则表达式的限制提供了一个解决方法。对于版本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>;
...
使用Acme::InputRecordSeparatorIsRegexp':all';

打开我的$fh,'老鼠。我想在某个地方有一个perl模块来完成它。有最喜欢的吗?@Erik:记住,如果您要执行
split',$\uu
,行终止符(以及任何尾随空格)将被删除。如果任何类型的尾随空白不重要,也可以使用
s/\s+\z/
而不是
chomp
。最后,您可以安装它,它允许您执行
打开我的$fh'@Erik:您要求提供替代方案(特别是一个模块),因此我建议了三种方法。如果您的输出文件完全缺少行终止符,那么很简单,您已经用
chomp
(或其他)删除了它们,而没有将它们放回输出。通常
s/\R\z/
不会使它们神奇地重新出现。@Erik:DOS Ctrl-z文件结束标记不应包含在磁盘文件大小中。它不再是必需的,因为Windows现在跟踪目录项中文件的大小,方法与Linux相同,因此如果您在输入数据中看到Ctrl-Z,那么它要么是一个bug,要么是数据的一部分。我很抱歉,如果你觉得我在你的问题解决后继续,但很明显,这不仅仅是行结束。所有系统将在最后一行之后写入文本文件,不带行终止符;如果您使用的是等价的
chomp
.re“为什么不直接使用
s{\R\z}{}
而不是
chomp
”,那么应该没有什么区别,为什么不直接使用
s{\s+\z}{/code>而不是
chomp
。如果您的格式有明显的尾随空白,则表示出现了问题。