Perl文件处理的大小有限?

我在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上显示复杂的消息... 多谢你们 !如果我最终管理,我会通知你     
已邀请:
yikes - 从基础开始:
use strict;
use warnings;
..在脚本的顶部。它会抱怨没有正确宣布你的词汇,所以继续这样做。我没有看到任何明显的截断你的文件,但也许你的一个或多个正则表达式是病态的。此外,不需要最后的undefs。 对于你正在做的事情,你可能会考虑使用sed     
你说“脚本停止”。它继续运行但不再产生输出?或者实际上停止运行?如果它停止运行,会是什么:
perl translate.pl mydump.sql > mydump-bbcode.sql
echo $?
节目?如果你在循环后加一个
print STDERR "done!n";
,那会出现吗?     
Perl当然可以处理大于18 MB的文件。我知道因为我经常通过Perl运行5 GB的文件。 我认为你的问题在
while($html=<FILE>)
。 每当
$html
设置为空行时,while将评估为False并退出循环。 你需要使用类似
while( defined( $html = <FILE> ) )
的东西 编辑: 嗯。我一直认为你需要
defined
但是在我的测试中它刚才没有退出空行或0.必须更多的是那种特殊的Perl魔法,它主要以你想要的方式工作 - 除非它没有。 事实上,如果你足够重构while循环,你可以欺骗Perl,让我按照我一直认为的方式工作。 (它可能有,在Perl 4或早期版本的Perl 5中) 这将失败:
$x = <>;
chomp $x;
while( $x ) {
    print $x;
    $x = <>;
    chomp $x;
}
    
可能会发生任何事情: 尝试将
$| = 1;
添加到脚本的顶部。这将使所有输出无缓冲。 你的一个正则表达是疯狂的,并在你不期待它时删除字符串。 你的磁盘空间已经用完了。 你的脚本没有什么问题(除了你缺少
use strict; use warnings;
而你没有使用
open()
的三参数形式)会导致它在一些魔法字节数后停止工作。     
大家好,非常感谢您的帮助和想法! 在尝试剪切和并行化作业之后,我试图在3个程序中删除我的程序,translate1.pl,translate2.pl和3 ...工作完成了,并且它的速度快8个活动核心! 然后我的launcher.sh连续启动每个拆分文件的3个脚本。完成2循环,在这里我们去:) 此致,Yoann     

要回复问题请先登录注册