Chciałbym osłabić przechwycone zmienne w kodzie generowanym przez Sub::Quote. Na przykład, oto niekwotowanym alternatywa:Osłabienie przechwytywania przy użyciu Sub :: Quote
use 5.10.0;
use Scalar::Util qw[ weaken ];
{
my $s = 'foo';
my $x = sub { say $s };
weaken(my $y = $x);
my $bar = sub { &$y };
&$bar;
$x = undef;
&$bar
}
i wyjście:
foo
Can't use an undefined value as a subroutine reference [...]
A oto moja Sub :: Cytat próba:
use 5.10.0;
use Sub::Quote;
use Scalar::Util qw[ weaken ];
{
my $s = 'foo';
my $x = sub { say $s };
weaken(my $y = $x);
my $bar = quote_sub('&$y', { '$y' => \$y });
&$bar;
$x = undef;
&$bar;
}
i wyjście:
foo
foo
Najwyraźniej złapany $y
nie jest osłabiony. Czy istnieje sposób na zmianę generowanego kodu w celu osłabienia przechwyconych zmiennych?
Dokumentacja jest skąpa, a implementacja Sub::Quote
jest złożona; Jestem dość przekonany, że nie jest to możliwe przy obecnym kodzie, ale chciałbym, aby okazało się, że jest źle.
Czy "osłabienie" rzeczywiście coś robi? Gdyby zadziałało, oczekiwałbym, że '$ y' stanie się' undef' zaraz po 'osłabieniu $ y'. – melpomene
@melpomene, istnieje drugie odniesienie do CV (jak widać z Devel :: Peek 'Dump'), choć nie wiem, co to jest. /// To powiedziawszy, oznacza to, że '$ y = undef;' faktycznie nie zwalnia subramu, jak oczekuje OP. Wezwanie do "osłabienia" może zostać usunięte bez wpływu na demo. – ikegami
@ikegami Założę się, że drugie odniesienie jest w samym optree, ponieważ sub nie jest zamknięciem, więc prawdopodobnie został stworzony podczas kompilacji i utrzymany na zawsze. – melpomene