Le problème que j'ai peut être trouvé en exécutant le code suivant dans Strawberry perl 5.12.3.0 sur Windows XP."Mémoire insuffisante" avec simple boucle de readline de fichier Win32 :: Unicode :: et Strawberry Perl
#!/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";
}
La seule chose qui se passe ici est que je joue un readline et cette mémoire jusqu'à ce que nous continuons à manger je reçois une erreur de dépassement de mémoire de Strawberry Perl. J'utilise un très gros fichier mais comme ce code est basé sur un flux, cela ne devrait pas avoir d'importance. Ai-je manqué quelque chose ici ou y a-t-il une fuite quelque part dans Strawberry perl? J'ai testé exactement le même code dans ActivePerl et là ça fonctionne très bien, c'est-à-dire qu'il ne mange pas de mémoire. Mise à jour: Remplacer Win32 :: Unicode :: File avec l'opérateur de diamant normal semble fonctionner sur ma distribution au moins. Voir le code suivant.
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";}
Donc, ce qui suggère que le problème réside avec le module Win32 :: Unicode droit?
Le fichier comporte-t-il des sauts de ligne? Tenter de lire une ligne pourrait finir par lire le fichier entier. – ikegami
@ikegami oui le fichier a des sauts de ligne et chaque ligne ne dépasse pas 255 caractères. –
Je suggérerais de mettre une instruction d'impression pour chaque ligne lue au lieu d'un bloc vide, ainsi vous pouvez voir que les lignes sont vraiment lues. Imprimez simplement "." ferait. Aussi, assurez-vous que vous avez vraiment $ line et non @line qui lirait le fichier entier. –