JSON::Syckの話

普通が一番。普通って難しい。普通って何だろう。
といった感じで普通にプログラム書いてたら以下のエラーに遭遇。
結構頻発しそうな気がするのでメモっときます。

まずエラーの内容

Dumping circular structures is not supported with JSON::Syck

と出まして何かわかりそうでわからん。
ので、屈辱感と共にYahoo!翻訳さんに聞いてみると

循環構造を投げおろすことは、JSONで支えられません。:Syck

との事でした。シック。

何となくわかった
つまり普通に書くと↓。うまく行くパターン。

#!/usr/local/bin/perl -l

use strict;
use JSON::Syck;

my %json = (
    hoge1 => { foo => 1 },
    hoge2 => { foo => 1 },
);

print JSON::Syck::Dump(\%json);
{"hoge2":{"foo":1},"hoge1":{"foo":1}}

と普通に出力されます。

しかし、↓となると話が別。よくないパターン。

#!/usr/local/bin/perl -l

use strict;
use JSON::Syck;

my $val = { foo => 1 };

my %json = (
    hoge1 => $val,
    hoge2 => $val,
);

print JSON::Syck::Dump(\%json);

ご想像通り。

Dumping circular structures is not supported with JSON::Syck

つまり、循環構造を投げおろすことは、JSONで支えられません。という事でした。シック。
やるなら一旦コピーしましょう。

my $val = { foo => 1 };

my %json = (
    hoge1 => {%$val},
    hoge2 => {%$val},
);

結構やってしまいそうじゃないですか??