JSON::XS::BooleanオブジェクトをData::Cloneしようとすると死ぬ
表題のとおり。以下のバージョンで確認。
rt.CPANは https://rt.cpan.org/Ticket/Display.html?id=82584
以下のようなテストをやってみると、
use strict; use warnings; use JSON::XS (); use JSON::PP (); use Data::Clone; use Test::More; use Test::Exception; foreach my $class (qw(JSON::PP JSON::XS)) { my ($true, $false) = eval qq{ (${class}::true, ${class}::false) }; my $clone_true; lives_ok { $clone_true = clone($true) } "${class}::true: clone OK"; ok($clone_true, "${class}::true is true"); my $clone_false; lives_ok { $clone_false = clone($false) } "${class}::false: clone OK"; ok(!$clone_false, "${class}::false is false"); } done_testing();
結果はこうなった。
ok 1 - JSON::PP::true: clone OK ok 2 - JSON::PP::true is true ok 3 - JSON::PP::false: clone OK ok 4 - JSON::PP::false is false not ok 5 - JSON::XS::true: clone OK # Failed test 'JSON::XS::true: clone OK' # at clone_json.pl line 12. # died: Modification of a read-only value attempted at clone_json.pl line 12. not ok 6 - JSON::XS::true is true # Failed test 'JSON::XS::true is true' # at clone_json.pl line 13. not ok 7 - JSON::XS::false: clone OK # Failed test 'JSON::XS::false: clone OK' # at clone_json.pl line 15. # died: Modification of a read-only value attempted at clone_json.pl line 15. ok 8 - JSON::XS::false is false 1..8 # Looks like you failed 3 tests of 8.
JSON::PPは平気なんだけど、JSON::XSはダメ。不思議。JSON::XSのせいなのかな?
JSONからデコードしたオブジェクトをクローンしようとしたらいきなり死んだので焦った。何が起こってるんだろう?
あ、ちなみにData::Cloneでclone()メソッドのないオブジェクトをクローンする場合はshallow copyになるらしいけど、ここではそれを承知で使ってみている。(JSON::**::Booleanはどうせ擬似的に普通のスカラとして扱われるオブジェクトだし)