PerlXS:入出力の型

perlの変数はスカラ値、配列、ハッシュの3つ。一方C/C++ではintやdouble、構造体、クラスなどが使われる。xsではC/C++のコードとPerlのコード間でこれらの変数をどのようにやり取りしているのかという話。生半可な知識で書いているので間違ってる可能性あり。注意されたし。


xsで記述する関数は、例えば

int
func(n)
int n
CODE:
  RETVAL = n * 2;
OUTPUT:
  RETVAL

という構造をしている。この例では入出力がint型になっている。これはperl

my $r = Test::func(5);

などと呼び出したときに引数の5がCのコードに渡るときにint型に変換され、戻り値のRETVALがPerlのコードに戻るときにスカラ変数に変換される。Perlの引数がスカラ変数な場合はxsのコードで引数リストにintやらdoubleと書いておくことで、それらの型として扱うことができる。ではPerlの引数が配列やハッシュの場合はどうするのか。
xsではPerlのスカラ、配列、ハッシュに対応したCの変数の型があるのでそれを使えば良い。具体的にはSV、AV、HVというのがそれ。これを使うと

AV *
func(a)
AV *a
CODE:
  RETVAL = a;
OUTPUT:
  RETVAL

などと書ける。
呼び出す側は

my $a = Test::func([1, 2, 3]);
foreach (@$a) {
  print;
}

などと書く。CODE:の中でSV、AV、HVを生成することもできるので、入力がintで戻り値がHVとかいう関数も書ける。ただこの辺の処理というのはメモリの確保や開放がわかりにくく、適当にコードを書くとメモリリークの危険があるため注意した方が良い。perlgutsに詳細があるので頑張って読もう!
http://www.kt.rim.or.jp/~kbk/perl5.005/perlguts.html