Проблема, с которой я столкнулся, можно найти, запустив следующий код в Strawberry perl 5.12.3.0 в Windows XP.
#!/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, верно?