とりあえず含蓄は後回しにして、以下同感。

ああこの変数は真偽値として扱ってるけど boolean というのはないんだったと JSON::XS::true とか使うんだけど、だんだんそれを変換するのが面倒になって、どうせ JSON 使うだろと思って横着して MyApp::true = JSON::XS::true みたいにエイリアスはって中でも JSON::XS::true を持たせてみたりして、そうしたら Perl の MongoDB ライブラリにおける真偽値Ingy さんのほうの boolean なのでやっぱり横着しちゃだめだなあ、とかそういうのをみると2013年になにをしているんだろうという感は強い。

とはいえ…

Perl, あるいは困ることについて - Kato Kazuyoshi
でも Web まわりは PSGI にまとまって良かったじゃないですか。真偽値もまとまると便利なんですよみなさん

それほどばらけているかというとさにあらず。

#!/usr/bin/env perl
use v5.12;
use boolean -truth;
use JSON;
use Data::Dumper;
say Dumper(0 == 1);
say Dumper(JSON::false);
どちらもfalseには\0を、trueには\1をそれぞれのpackageにblessしてるだけ。違いはどこにblessしているという点のみ。

しかしJSON::XSはそこを気にする。allow_blessedを設定していても、TO_JSON()を定義していないとnullになってしまう。

よって目下の best practice はこんなところではなかろうか。

https://gist.github.com/dankogai/5284015
#!/usr/bin/env perl
use v5.12;
use boolean -truth;
use JSON;
sub boolean::TO_JSON() { !$_[0] ? \0 : \1 }

my $json = JSON->new->convert_blessed;
my $bools = { false => ( 0 == 1 ), true => ( 1 == 1 ) };

eval { say encode_json($bools) };
warn $@ if $@;
say $json->encode($bools);
  1. true / falseはboolean.pmのみを利用。
  2. boolean::to_JSON()をモンキーパッチ

1.はboolean.pmが対応してくれれば不要になるので、Pull Requestしておきました。

Dan the True Perl Monger

P.S. ingyより入電。merge && $boolean::VERSION++ 完了とのこと。