PHPでシリアライズしたデータをPerlで扱う

PHPには、配列(および連想配列)やオブジェクトをシリアライズて文字列にしたり、元に戻したりする関数があります(serializeunserialize)。
配列等をファイルやデータベース等に保存する際に、これらの関数を使うと便利です。

serialize関数でシリアライズしたデータを、Perlで扱いたい場面がありましたので、その方法を調べてみました。

1.PHPでシリアライズしてPerlで読む

PHPのシリアライズをPerlで扱うモジュールとして、PHP::Serializationがあります。

PHPでシリアライズしたデータをPerlで読むには、unserializeというサブルーチンを使います。
たとえば、PHPで以下の配列を作ったとします。

$a = array(
    'name' => array(
        'first' => 'Taro',
        'last' => 'Yamada',
    ),
    'birthday' => '1970-5-1',
);

この配列をシリアライズすると、以下の文字列が得られます。

a:2:{s:4:"name";a:2:{s:5:"first";s:4:"Taro";s:4:"last";s:6:"Yamada";}s:8:"birthday";s:8:"1970-5-1";}

この場合、以下のようなコードで、Perlでデータを復元することができます。

use PHP::Serialization qw( serialize unserialize );

my $ser = 'a:2:{s:4:"name";a:2:{s:5:"first";s:4:"Taro";s:4:"last";s:6:"Yamada";}s:8:"birthday";s:8:"1970-5-1";}';
my $a = unserialize($ser);

結果をダンプしてみると、以下の通り正しく変換できています。

$VAR1 = {
          'name' => {
                      'first' => 'Taro',
                      'last' => 'Yamada'
                    },
          'birthday' => '1970-5-1'
        };

2.PerlでシリアライズしてPHPで読む

上記の逆方向で、Perlのデータをシリアライズして、それをPHPで読むこともできます。

Perl側では、「serialize」というサブルーチンを使って、配列やハッシュなどを文字列に変換します。
たとえば、名前が%hのハッシュがある場合、それをシリアライズして変数$serに代入するには、以下のように書きます。

$ser = serialize(\%h);

一方、PHP側では「unserialize」という関数を使って、データを復元します。
たとえば、シリアライズした文字列が変数$serに入っていて、その復元結果を変数$aに代入するには、以下のように書きます。

$a = unserialize($ser);