我有一个脚本,MM.pl它是"主力",它是一个简单的"补丁文件".在这种情况下,修补程序文件的目标是.ini文件以进行搜索和替换.很简单.我花了5天才意识到ini \0在每个字母之间用null()字符编码.从那以后,我尝试了在代码片段,use::函数和正则表达式中都可以找到的每个选项.我发现它的唯一原因是我曾经use Data::Printer;转储了几个值.在Notepad ++中,ini似乎被编码为USC-2 LE.重要的是,MM.pl处理任务,而不是要求用户"修复"的问题.
更新:这可能提供线索\ xFF\xFE是ini文件中的前2个字符.它们在处理后出现.交换实际上并没有像它应该的那样改变任何其他东西,而是"揭示"2个隐藏的角色.
正如你所注意到的那样,那些空值不只是被剥离的垃圾; 它们是文件字符编码的一部分.解码它:
open my $fh, '<:encoding(UCS-2)', 'file.ini';
Run Code Online (Sandbox Code Playgroud)
一旦完成,就以同样的方式将其写回.