PerlでC/C++ライブラリを使うときには、XSでラッパーを書いてあげる必要があります。C++はオブジェクトになっているものがあるので、ちょっと手間がかかるのです。
C++の関数を実行し、文字列をPerlへ返すとき
cpplibという名前のライブラリに、実行するとstd::stringを返す関数func1()があったとします。これをXSのなかで実行させて、文字列をPerlへ返すときは、次のように書けます。
SV * cpplib::func1() PREINIT: std::string s; CODE: s = THIS->func1(); RETVAL = newSVpv( s.c_str(), s.length() ); OUTPUT: RETVAL
まず、PREINIT欄。func1()を実行したときの返り値の受け皿として、std::stringの変数をひとつ用意しておきます。
CODE欄でfunc1()を実行し、さっきの受け皿変数に保存。これをPerlの何でもありな変数に変換するのが次の行なのです。RETVALはPerlへの返り値専用の変数で、宣言は不要です。このRETVALに、C/C++の文字列からPerlのスカラー変数(SV)を生成する関数(newSVpv)を通してあげればOKなのです。
newSVpvは引数1つ目にstd::stringの文字列部分、2つ目に文字列の長さを与えることで、Perlのスカラー変数に文字列を代入した状態のものを返します。newSVpvのpvが文字列を表しており、例えば整数型ならnewSVivを使うといった具合に、C/C++側の変数型にあわせて使い分ける必要があります。
Perlから文字列を渡し、C++の関数の引数とするとき
これから書く