可以通过在 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";
}
这里唯一发生的事情是我执行了一个 readline,这一直在消耗内存,直到我从 Strawberry perl 收到内存不足错误。我正在使用一个非常大的文件,但由于此代码是基于流的,所以应该无关紧要。我在这里遗漏了什么或者 Strawberry 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 模块上,对吗?
最佳答案
也许 $/(或 $INPUT_RECORD_SEPARATOR)不是新行? 或 $[(第一个数组元素的索引和(子)字符串中的第一个字符)不为 0。
模块在读取或读取行期间使用这两个变量。
顺便说一句:它太慢了,因为它使用 3 个函数调用一次读取每一行一个字符,然后为每个读取的字符调用 Encode::decode,然后将其添加到 readline 返回给您的代码的行缓冲区。呸!
关于windows - "Out of memory"带有简单的 Win32::Unicode::File readline 循环和 Strawberry Perl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8710934/