我在perl中创建了一个用于留言板迁移的翻译器,我所做的只是应用正则表达式并打印结果。我将stdout写入文件,然后我们开始了!但问题是我的程序在18 MB写完后无法工作!
我做了一个translate.pl(https://gist.github.com/914450) 并使用此行启动它: $ perl translate.pl mydump.sql> mydump-bbcode.sql
对于代码质量真的很抱歉但我从不使用perl ...我尝试使用sed进行相同的工作,但没有设法应用我在原始脚本中找到的正则表达式。
[编辑] 我重新编写代码并清理了一些正则表达式(请参阅gist.github.com/914450),但我仍然卡住了。当我在15M文件中拆分大转储时,我启动了translate.pl 7(进程)7来使用所有内核,但脚本停止在可变大小。 “tail”命令在任何URL停止时都不会显示复杂的消息...
谢谢大家!我告诉你,如果我最终管理
答案 0 :(得分:1)
yikes - 从基础知识开始:
use strict;
use warnings;
..在脚本的顶部。它会抱怨没有正确宣布你的词汇,所以继续这样做。我没有看到任何明显的截断你的文件,但也许你的一个或多个正则表达式是病态的。此外,不需要最后的undefs。
对于您正在做的事情,您可以考虑使用sed
答案 1 :(得分:1)
你说“脚本停止”。它继续运行但不再产生输出?或者实际上停止运行?如果它停止运行,那么:
perl translate.pl mydump.sql > mydump-bbcode.sql
echo $?
显示?如果你在循环后添加print STDERR "done!\n";
,那会显示吗?
答案 2 :(得分:0)
Perl当然可以处理大于18 MB的文件。我知道因为我经常通过Perl运行5 GB的文件。
我认为您的问题出在while($html=<FILE>)
。
每当$html
设置为空行时,while将评估为False并退出循环。
您需要使用while( defined( $html = <FILE> ) )
编辑:
嗯。我一直认为你需要defined
,但在我的测试中,它现在没有退出空行或0.必须更多的那种特殊的Perl魔法,大部分按你想要的方式工作 - 除非它没有“T
事实上,如果你重新调整while循环,你可以欺骗Perl,让我按照我一直认为的方式工作。 (它可能在Perl 4或早期版本的Perl 5中)
这将失败:
$x = <>;
chomp $x;
while( $x ) {
print $x;
$x = <>;
chomp $x;
}
答案 3 :(得分:0)
可能会发生任何事情:
$| = 1;
添加到脚本的顶部。这将使所有输出都无缓冲。你的脚本没有什么问题(除了你缺少use strict; use warnings;
并且你没有使用open()
的三参数形式)会导致它在一些魔法之后停止工作字节数。
答案 4 :(得分:0)
大家好,非常感谢您的帮助和想法! 在尝试剪切和并行化作业之后,我尝试在3个程序中剪切我的程序,translate1.pl,translate2.pl和3 ...工作已完成,并且它的速度快8个活动核心!
然后我的launcher.sh连续为每个分割文件启动3个脚本。用2个循环完成,我们在这里:)
此致,Yoann