Zna się ktoś na prel'u ?

Radoslaw Zielinski radek w karnet.pl
Nie, 12 Gru 2004, 23:54:09 CET


Przemysław Iskra <sparky w servek.sparky.homelinux.org> [12-12-2004 15:26]:
[...]
> 	while (<F_IN>) {
> 		print "$_";

Tu nadpisałeś $_...

> my $specdir="/home/users/sparky/pld-cvs/SPECS";
> opendir DIR, "$specdir";
> foreach( sort readdir DIR ) {

...które wcześniej użyte zostało tu.  $_ jest zmienną globalną (o ile
nie podasz konkretnej przestrzeni nazw, np. $Foo::_).

[...]
> pod koniec działania program ten zajmuje ~30MB pamięci (przy większym
> pliku więcej)
> to się robi jakaś historia zmiennych czy coś ?

Nie, to jakiś błąd przy zliczaniu referencji.  Zgłoś przez perlbug;
że jest spora szansa, że ktoś się tym zajmie (niedawno dodawali
optymalizację foreach reverse .., później ktoś poprawiał, a to wygląda na
powiązane... ale tylko na pierwszy rzut oka, bo 5.8.3 też jest podatny).

Załączam nieco prostszy test-case.  Wywołanie:

  $ ./leak.pl 50000 >/dev/null 
    PID TTY      STAT   TIME  MAJFL   TRS   DRS  RSS %MEM COMMAND
   3101 pts/1    R+     0:00      0     8  5167 1440  0.5 /usr/bi
   3101 pts/1    S+     0:00      0     8  7999 4244  1.6 /usr/bi
   3101 pts/1    S+     0:01      0     8 14075 10336  4.0 /usr/b
   3101 pts/1    R+     0:03      0     8 24239 20412  7.9 /usr/b
   3101 pts/1    S+     0:03      0     8  8131 4408  1.7 /usr/bi

Jeśli chcesz, żeby Ci ,,po prostu działało'', to nie używaj $_
w funkcjach, które mogą być wywoływane w pętlach (albo "local *_"
na początku).  "while (my $coś = <F_IN>)" nie jest aż tak długie, a
minimalnie szybsze.  Zamiana "print while" na "map print," też załatwia
sprawę (map i grep robią "local *_").

-- 
Radosław Zieliński <radek w karnet.pl>
[ GPG key: http://radek.karnet.pl/ ]
-------------- następna część ---------
Załącznik, który nie był tekstem został usunięty...
Name: nie znany
Type: application/pgp-signature
Size: 189 bytes
Desc: nie znany
Url : /mailman/pipermail/pld-devel-pl/attachments/20041212/08a417e7/attachment.bin


Więcej informacji o liście dyskusyjnej pld-devel-pl