Проблема, с которой я столкнулся, может быть найдена при запуске следующего кода в 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, и это продолжает потреблять память, пока я не получу ошибку Out of memory из Strawberry Perl. Я использую действительно большой файл, но так как этот код основан на потоке, это не должно иметь значения. Я что-то здесь упускаю или есть утечка где-то в клубничном Perl? Я тестировал точно такой же код в ActivePerl, и там он отлично работает, то есть не ест памяти.
Обновление: замена Win32 :: Unicode :: File обычным оператором diamond, по крайней мере, работает в моем дистрибутиве. Смотрите следующий код.
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, верно?