Perl中的递归引用

new*_*erl 4 perl refcounting

$a=\$a;
Run Code Online (Sandbox Code Playgroud)

我正在阅读的这本书说在这种情况下$a永远不会是免费的,我的问题是为什么perl解释器在编译时没有修复它?当它发现它指向自身时,不要增加refcount.

为什么perl不这样做?

Jon*_*rdy 6

一些垃圾收集器有循环检测; 出于性能和历史原因,Perl没有.如果您想要一个不影响引用计数的引用,您可以使用Scalar::Util::weaken获取弱引用,这样就无需在需要依赖它的大多数情况下进行循环检测.需要在解释器中内置循环检测,以自动检测是否\$a应该是弱引用或强引用,因此您只需要明确地执行它.

  • @new_perl:执行检查需要时间,并且情况可能并不总是像引用自身的单个变量那样简单.您可以在非常大的数据结构上进行循环,这需要循环检测器遵循非常长且耗时的路径. (2认同)
  • @new_perl在你的例子中,这可能很容易,直接引用自己.但谁会这样做?野外的循环引用绝不像$ a =\$ a那么简单. (2认同)