【发布时间】:2021-06-11 12:35:38
【问题描述】:
我正在使用 Perl v5.30 在 Linux 上使用 Windows 行终止符 (\r\n) 处理文本文件。
我不明白为什么,对于这些文本文件,捕获组不匹配字符,而正则表达式匹配。
例子:
$ echo $'Line1\r\nLine2\n' | perl -ne 'print /(.*)/'
Line2
$ echo $'Line1\r\nLine2\n' | perl -ne '/(.*)/ && print "match\n"'
match
match
match
第一行没有被捕获,但所有(三)行都匹配。
为什么会这样?
【问题讨论】:
-
不要相信终端,它会骗你。总是使用一些东西以明确的形式转储数据。
B::perlstring()是一个核心模块功能,可以很好地完成此操作。perl -MB -nE 'say B::perlstring( /(.*)/ ); -
您几乎不应该发明以与您遇到问题的方式不同的方式显示问题的问题。您说您在读取具有不同行尾的文件时遇到问题,并且此问题或此代码中不涉及任何文件。你还没有得到任何关于如何解决这些问题的建议。这种特殊情况是关于打印带有特殊字符的字符串时发生的情况。您的解决方案将是如何修复或删除错误的行尾。
-
@TLP 而且你永远不应该添加没有技术价值的 cmets,只是为了论证 - 代码在功能上与
cating 到文件相同,并将文件用作 Perl 输入.其实,由于上述逻辑避免了人们阅读多余的cat命令,你应该感谢我! -
@Marcus 人们提出问题时常犯的错误是,就他们认为需要知道的事情提出问题以解决他们遇到的另一个问题。它被称为XY-problem。我的陈述是事实,而不是争论。坦率地说,我什至不知道您所说的“读取多余的 cat 命令”是什么意思,但我假设您是在谈论执行
cat foo.txt | perl -ne'....'的常见新手错误,而您可以执行perl -ne'...' foo.txt。
标签: perl line-endings capturing-group