JSONモジュールとJSON::PPモジュールの共存
JSONモジュールとJSON::PPモジュール、どちらかが使えれば基本的には問題ないでしょうが、もし何かしらの理由で両方使いたくなった場合にどうするか。
普通にuse JSON、use JSON::PPと書いただけでは、"Prototype mismatch: sub main::decode_json"のようなメッセージが表示されてしまう。
そこで、JSONモジュールとJSON::PPモジュール用にパッケージを分けて、それぞれのパッケージの中でuseするようにする。
本体側の処理は、それぞれのパッケージの処理を呼び出すようにする。
サンプルソース
サンプルソースの中では、JSONモジュールのデコードをわざと失敗させるため、不正なフォーマットにしている。
#!/usr/bin/env perl use Data::Dumper; my $text1 = '"a": "hoge"}'; # illegal format my $text2 = '{"a": "hoge"}'; # formal format eval { print "*" . Dumper (XS::decode_json_xs($text1)); }; if ($@) { print $@; print "+" . Dumper (PP::decode_json_pp($text2)); } package XS; use JSON; sub decode_json_xs { my $text = shift; decode_json($text); } package PP; use JSON -support_by_pp; sub decode_json_pp { my $text = shift; decode_json($text); }
実行結果
/Users/junya/develop/perl% ./JsonSample.pl garbage after JSON object, at character offset 3 (before ": "hoge"}") at ./JsonSample.pl line 22. +$VAR1 = { 'a' => 'hoge' };
もっと簡単に回避できる手段がありそうが気がするが、よく分からない。