我可以通过在Windows XP上的Strawberry perl 5.12.3.0中运行以下代码找到我遇到的问题。
#!/usr/bin/perl -w
use strict;
use warnings;
use Win32::Unicode::File;
use Encode;
my $fname = shift @ARGV;
my $fh = Win32::Unicode::File->new;
if ($fh->open('<', $fname)){
while (my $line = $fh->readline()){}
close $fh;
}else{
print "Couldn't open file: $!\n";
}
这里唯一发生的事情就是我执行了一条读取线,这会一直记忆,直到我从Strawberry perl中得到一个内存不足的错误。我使用的是一个非常大的文件,但由于此代码是基于流的,因此无关紧要。我在这里遗漏了什么,或者在草莓perl的某个地方有泄漏吗?我在ActivePerl中测试了完全相同的代码,并且它工作正常,即它不会占用内存。
更新:用普通的菱形运算符替换Win32 :: Unicode :: File似乎至少可以在我的发行版上工作。请参阅以下代码。
use strict;
use warnings;
my $fname = shift @ARGV;
if (open(my $fh, '<', $fname)){
while (my $line = <$fh>){}
close $fh;
}else{ print "Couldn't open file: $!\n";}
那么这表明问题出在Win32 :: Unicode模块上吗?
答案 0 :(得分:1)
也许$ /(或$ INPUT_RECORD_SEPARATOR)不是新行? 或$ [(第一个数组元素的索引和(子)字符串中的第一个字符)不是0.
在读取或读取线期间,模块使用这两个变量。
BTW:它非常慢,因为它使用3个函数调用一次读取每行一个字符,然后为每个读取字符调用Encode :: decode,然后将其添加到readline返回到代码的行缓冲区。呸!答案 1 :(得分:1)
我想有点不正统,但我会回答我自己的问题。我已经用Path :: Class :: Unicode包替换了Win32 :: Unicode :: File包,而不是读取unicode文件。这工作正常(即没有内存吃)所以它似乎问题是在Win32 :: Unicode :: File包中,很可能是一个bug。我已经联系了该软件包的作者,他正在研究它。如果您要我提供代码,请告诉我。这很简单。