確認
use strict;
use warnings;
use JSON::PP ();
use JSON::XS ();
sub context {
my $con = wantarray;
if(!defined($con)) {
print "VOID\n";
}elsif($con) {
print "LIST\n";
}else {
print "SCALAR\n";
}
return "{}";
}
print "PP (ver $JSON::PP::VERSION): ";
JSON::PP::decode_json(context());
print "XS (ver $JSON::XS::VERSION): ";
JSON::XS::decode_json(context());
出力結果:
PP (ver 2.27202): LIST
XS (ver 3.01): SCALAR
だからなんなのか?
下のような複数行のJSONファイル(hoge.json)があったとして、
{"foo":
"bar"}
こいつを読み込んでdecodeするプログラムが環境によっていきなり動かなくなって焦った。
use strict;
use warnings;
use File::Slurp qw(read_file);
use JSON qw(decode_json);
use Data::Dumper;
my $data = decode_json(read_file("hoge.json"));
print Dumper $data;
問題はFile::Slurpのread_file
関数の挙動がコンテキストによって異なるということ。
- スカラコンテキストでは、ファイル全体のデータを返す。
- リストコンテキストでは、ファイルの各行のリストを返す。
そのため、JSON::XS
のない環境(JSON::PP
が使われる環境)ではエラーになった。
File::Slurp::Tinyはこういうコンテキスト依存性がないので、こっちを使ったほうがいいのかもしれない。