Sub::Quoteによって生成されたコードのキャプチャされた変数を弱体化したいと思います。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
}
と出力:たとえば、ここでは非引用された代替です
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;
}
と出力:
foo
Can't use an undefined value as a subroutine reference [...]
そして、ここでは私のサブ::引用試みです
foo
foo
明らかに、キャプチャされた$y
は弱くはありません。キャプチャされた変数を弱めるために生成されたコードを変更する方法はありますか?
ドキュメントは疎であり、Sub::Quote
の実装は複雑です。私はこれが現在のコードでは不可能だと確信していますが、私は間違っていることが示されたいと思います。
実際に何かを弱めるのか?それがうまくいけば、$ yを弱めた直後に '$ y'が' undef'になると思ったでしょう。 – melpomene
@melpomene、私はそれが何であるかわからないが、CVへの2番目の参照がある(Devel :: Peekの 'Dump'を使って見られるように)。 ///それは、 '$ y = undef; 'はOPが期待するように実際にサブを解放しないということです。デモに影響を与えずに 'weaken'への呼び出しを取り除くことができました。 – ikegami
@ikegami 2番目の参照はoptree自体にあると思います。サブはクロージャではないので、おそらくコンパイル時に作成され、永遠に残っています。 – melpomene