内联处理文件时的perl内存使用情况

内联处理文件时的perl内存使用情况,perl,Perl,我有一个CGI脚本,我们的员工使用它从他们无法直接访问的服务器获取日志。出于我不想深入讨论的原因,在我们的应用程序最近更新之后,这些日志中的一些现在已经将换行符、制表符、反斜杠等字符翻译成了它们的文本等价物。因此,我修改了CGI脚本,以调用以下命令将其转换回原始值: perl -i -pe 's/\\r/\r/g && s/\\n/\n/g && s/\\t/\t/g && s/\\\//\//g' $filename 我刚刚被告知,有些人现在在

我有一个CGI脚本,我们的员工使用它从他们无法直接访问的服务器获取日志。出于我不想深入讨论的原因,在我们的应用程序最近更新之后,这些日志中的一些现在已经将换行符、制表符、反斜杠等字符翻译成了它们的文本等价物。因此,我修改了CGI脚本,以调用以下命令将其转换回原始值:

perl -i -pe 's/\\r/\r/g && s/\\n/\n/g && s/\\t/\t/g && s/\\\//\//g' $filename
我刚刚被告知,有些人现在在尝试获取相当大(几百MB)的日志时,会出现内存不足错误

我的问题是:当调用像这样的内联命令时,perl如何管理内存?它是读入整个文件,处理它,然后写出它,还是创建一个临时文件,一次一行地处理输入文件中的行,然后在完成后替换文件


这是在64位Amazon linux实例上使用perl 5.10.1。

-p开关创建一个
while(){…;print}
循环,在输入文件中的每一行上迭代

如果您的所有新行都已转换为
“\\n”
,则您的文件将只是一个很长的行。因此,您的命令将把整个文件加载到内存中以执行修复

为了避免这种情况,您必须使用或故意缓冲文件

创建一个实际的脚本而不是一行程序来完成这项工作可能是最容易的。但是,如果您知道所有新行都已转换,那么一个简单的修复方法就是使用
$/=“\\n”

第二,你的正则表达式有缺陷。您当前正在使用快捷方式操作符列出您的翻译。如果先前的任何一个正则表达式与特定行不匹配,则不会尝试其他翻译。您应该使用简单的分号来分隔正则表达式:

's/\\r/\r/g; s/\\n/\n/g; s/\\t/\t/g; s|\\/|/|g'