はじめてのSVN::Client

とりあえず、あせらず、じっくりと進めていく感じで。SubversionをPerlから操作するためのバインディングを少しづつ使って行きます。

読み込み認証いらないsvnサーバからデータを拾って表示するのは以下のような感じ。

use strict;
use warnings;
use SVN::Client;

sub say { print @_, "\n"; }

my $ctx = SVN::Client->new(); # SVN::Clientオブジェクトの作成

my ($fh, $fc) = (undef, '');
open($fh, '>', \$fc);

# svn cat http://svn.douzemille.net/repos/codepieces/poe.pl とおなじ
$ctx->cat($fh, 'http://svn.douzemille.net/repos/codepieces/poe.pl', 'HEAD');

close($fh);

say $fc;

SVN::Clientオブジェクトと作ってcatメソッドを読んでやるだけで簡単です。ただし、このcatメソッドが微妙にくせ者で、第一引数にファイルハンドルを取ります。読み込んだデータはスカラ変数に放り込まないといまいち使えないので、

my ($fh, $fc) = (undef, '');
open($fh, '>', \$fc)

として、メモリ内へのファイルハンドルとして使います。perldoc -f openによると

Since v5.8.0, perl has built using PerlIO by default.  Unless
you’ve changed this (i.e. Configure −Uuseperlio), you can open
file handles to "in memory" files held in Perl scalars via:

    open($fh, ’>’, \$variable) || ..

とあるように、第3匹数にスカラ変数のリファレンスを渡すと、そのスカラ変数にデータを書き込むようなファイルハンドルを作成してくれるようです。Tieか何かでやるのかと思ってはまったよ…

SVN::Clientはsvnコマンドから実行できるいろんな機能や、認証などもできるようです。チェックチェック。