我想減弱由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
}
和輸出:
foo
Can't use an undefined value as a subroutine reference [...]
這是我的子::報價的嘗試:
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
foo
顯然捕獲的$y
沒有被削弱。有沒有更改生成的代碼來減弱捕獲的變量的方法?
文檔很少,而且Sub::Quote
的實現很複雜;我確信目前的代碼是不可能的,但我很樂意被證明是錯誤的。
那裏的'weaken'實際上做了什麼嗎?如果它有效,我會希望'$ y'在'weaken $ y'之後變成'undef'。 – melpomene
@melpomene,還有第二個引用CV(如使用Devel :: Peek的'Dump'看到的),但我不知道它是什麼。 ///這就是說,這意味着'$ y = undef;'實際上並沒有釋放子任務,因爲OP期望。在不影響演示的情況下,可以刪除對'weaken'的調用。 – ikegami
@ikegami我假設第二個引用是在選擇本身,因爲sub不是閉包,所以它可能是在編譯期間創建的,並且只是永遠存在。 – melpomene