PHPのsimplexmlでハマる

PHPでXMLファイルを使用する必要がありました。
多段階層のデータを参照配列で扱いたいのです。
PHPでXMLファイルを作成して、Perlのスクリプトで使用するというプロセスです。
PHPのセッションに格納しておいて、セッションファイルを直接読みに行かせるなども考えたのですが、
メンテナンスを考えて結局XMLファイルを用意する方法に決定。

XMLファイルをPHPで読み直す際に問題が発生。
ノードがオブジェクトのまま、simpleXMLElementになっていて扱いづらい。
単階層の場合は、(string)$hogeとか、“$hoge”とかするだけで何とかなるのですが、多段階層の場合はそうもいきません。
他に構造を扱う関数としてjson_decode(json_encode($hoge),true)で何とかなるかと思いきや、空値が配列になってしまう問題が発生。空値用の特別文字「{empty}」などを用意してみたりしても、判定を追加する箇所が多すぎで挫折。
さらに、「<!CDATA[fuga]]>」も配列になることが判明、まったく使い物になりませんでした。

最終的には、ドキュメントで何を言っているのかよくわからなかったパラメータを適当に採用していたら、希望する動作を見せたので落ち着きました。
結局はこうなりました。
simplexml_load_file( $set_file, 'simpleXMLElement', LIBXML_NOCDATA )

PHPは、関数の動作がこうもいい加減なものが多いですね。
互換のためにいろんなパラメータが追加されたり、関数名が変更になったりと振り回され続けるしかないですね。

PerlのJSONで文字化けを回避する

CGIでフォームから送信された文字列をJSONにエンコードしていたときの話です。
キーは英数字、値をUTF-8の文字列にした場合、エンコードした結果をSTDOUTに出力した場合は問題ないのに、DBに格納すると化けるという不思議な現象が発生しました。
「Perl JSON 文字化け」なので検索すると色々出てきますが、どれも参考にならず。「to_json()」も「encode_json()」もダメで、適当にいじっていたら「JSON->new->latin1->encode()」が正解でした。
とはいえ、なぜそうなのかが不明なので、環境によっては動かないかもしれません。
とりあえず、文字コード周りはエンコードを回避するためのパラメータを用意しておいて欲しいものです。
あと、JSONはpureperlなので、スクリプトをアップする際には使用したモジュールをコピーしておくと、動作が保障されると思われます。
でめたしでめたし。

Perlモジュールのバージョン違いに填まる

自作CMSでJSONを使うことにしました。
最近あまり使っていませんが理屈はわかっています。JavaScriptではevalです。
ではなくて、PerlではJSONモジュールを利用すれば問題ない、はずでした。
結論から言うと、ローカルのテスト環境と、coreserverではJSONモジュールのバージョンが違うためにサブルーチンが見つからないとかいわれて怒られていたのでした。
ローカルの環境では2.21、coreserverは3年前の1.14で、to_jsonやfrom_jsonがありません。幸いなことにJSONhaPurePerlなのでコピーするだけでも動きます。
ということで、ライブラリパスを追加するのですが、pushではダメです。
先に読んでくれないと困るのでunshiftします。

BEGIN{ unshift @INC, (./'; }


これで問題なく動くようになりました。
ちなみに、unshiftではなくてpushを使ってしまっていて、なぜ新しいバージョンを読まないのだろうと数時間悩んだなんて恥ずかしくていえません。
なにはともあれでめたしでめたし。