【发布时间】:2012-02-25 20:13:20
【问题描述】:
我需要使用 perl 流式处理一个 1Gb 文本文件,该文件以 UTF-16 little-endian 编码,具有 unix 风格的结尾(即 0x000A 仅在流中没有 0x000D)和开头的 LE BOM。文件在 Windows 上处理(也需要 Unix 解决方案)。我所说的流式处理是指使用 while (),逐行读取和写入。
最好有一个命令行单行,例如:
perl -pe "BEGIN { SOME_PREPARATION }; s/SRC/DST/g;" infile.txt > outfile.txt
用于测试的输入的十六进制转储(两行:每行“a”和“b”字母): FF FE 61 00 0A 00 62 00 0A 00
像 s/b/c/g 这样的处理应该给出一个输出(“b”替换为“c”): FF FE 61 00 0A 00 63 00 0A 00
PS。现在,在我所有的试验中,要么是 CRLF 输出有问题(输出 0D 0A 字节会产生不正确的 unicode 符号,我只需要 0A00 而没有 0D00 来保持相同的 unix 样式),或者每个新行都切换 LE/BE,即相同的“a " 输出的奇数行是 6100,偶数行是 0061。
【问题讨论】:
-
Perl 5.what?有一些差异,我想确保我的答案适合你。
-
它棘手的原因是 Perl 在您有机会将 :encoding(UTF-16le) 添加到句柄之前添加了 :crlf,这会使它们的顺序错误。
-
@ikegami 你能解释一下 :crlf 的用法吗?如果像 ":crlf:encoding(UTF-16LE)" 这样出现,它会做什么?