Perlコアモジュール(5.8)の Scalar::Util ですが、これには xs 版と pp 版があって、それぞれ実装されているメソッドが違っていたりするそうです。
Scalar::Util のページにも以下のように書いてある。
Scalar::Util contains both perl and C implementations of many of its functions so that those without access to a C compiler may still use it. However some of the functions are only available when a C compiler was available to compile the XS version of the extension.
At present that list is: weaken, isweak, dualvar, isvstring, set_prototype
だから、
Scalar::Util に依存してxs版のメソッドを使っているモジュールやアプリで、うっかり xs --> pp にバージョン変えてしまったりすると動かなくなったりする。
なんか、
POEで書いてた IRC bot が急に動かなくなってそれっぽいエラーを吐いていたので、 Scalar::Util を force install したら直った(本来は Makefile.PL にオプション渡すのが良いみたい)。
たぶん、AnyEvent::IRC をインストールした時に、Scalar::Util の pp 版が入ってしまったのだと思う(何かやったと言えばそれくらいで、AnyEvent::IRC の Makefile.PL に Scalar::Util が入っていたのでそうかなとか。。。Scalar::Util はその前から xs 版が入っていたはずなんだが、っつか、Cコンパイラ入ってるので pp 版が入ったのは Config.pm で認識されなかったとかかなあ)。
まあそれ以上は追いかけていないので、見当違いの可能性も大いにある。
とにもかくにも、
うっかり起きてしまうととても怖いなあと思ったのでメモ。
参考:
・解決:Scalar::Util::weakenを使おうとするとWeak references are not implementedで落ちる
