参照カウント

Perl にも weak reference があることを知った。これを使ってゴミサイクルを作らないようにするのは、なんだかとても難しそうな気がする。

$ cat test.pl
use Scalar::Util qw(weaken);
for (my $i = 0; $i < 200000; $i++) {
  my @x;
  push @x, \@x;
  weaken $x[0] if $ARGV[0];
}
print `ps -co rss,command | grep perl`;  # メモリ使用量

$ perl test.pl
 19312 perl
$ perl test.pl weak
   988 perl

なお、referent が消滅すると undef になる。

$ cat test.pl
use Scalar::Util qw(weaken);
my $x;
{
  my $y = "Hello!";
  $x = \$y;
  weaken $x;
  print defined($x), " => $$x\n";
}
print defined($x), " => $$x\n";

$ perl test.pl
1 => Hello!
 =>