XSにおけるデータ操作関数perlapiとはXSでPerlのデータを操作するための公式APIで、C言語で書かれたマクロや関数のことです。出力、スカラ、標準入出力PerlとXS(C言語)のAPIの対応がわかるとXSがわかりやすそうだ。"Hello");PerlIO_printfはC標準ライブラリのprintfにあたる関数。引数はPerlIO*型の変数、第二引数はchar*型の変数。標準出力はPerlIO_stdout関数で取得できる。XSでは標準入出力Cの標準ライブラリは使わずに、Perlで用意されている関数を使う。これはperlapioというドキュメントに詳しく乗せられている。0);PerlのスカラはXSではSV*に対応します。newSVpv関数で文字列を表現するSV*を作成することができます。第二引数はSTRLEN型の引数で、文字列の長さを指定します。0を指定すると自動的に文字列の長さを決定してくれます。この他のものとして、効率を重視した、newSVpvn関数やnewSVpvs関数もあります。C言語のAPIは省略が多いので覚えるのが大変ですが、慣れるまでがんばるしかないです。SVのSはスカラという意味、Vは値(value)という意味です。newSVpvのpはポインタ(pointer)という意味です。これは実質的には文字列を表します。pは文字列と覚えます。newSVnv(1.14);Perlでは数値はすべてどのようなものでも浮動小数点として扱われますが、内部的に見ると符号なし整数(UV型)、整数(IV型)、数値型(NV型)の三種類がある。数値型が最も汎用性があるが、効率は符号なし整数や整数のほうがよい。これらはSV*の内部的な値として保持されます。IVのIはintのiです。NVのNはnumberのnです。未定義値(undefに対応)XSではPerlのundefは、&PL_sv_undefで表現します。&PL_sv_undef;値が定義されているかどうかのチェック(defined関数に対応)SV*型の値が定義されているかどうかを確認するには、SvOK関数を使用します。これはPerlのdefined関数相当のことをします。}SV*からchar*型への変換SV*に文字列や数値が含まれている場合はそれを他の関数などで使う場合に、char*型にする必要があります。SvPV_nolen(sv_some);SvPV_nolen関数の第一引数はSV*型の変数です。長さについては自動的に計算してくれます。PerlIO_close(infh);}難しい。ファイル入出力ってこれであっているのかなぁ。SV*は揮発性にしておくSV*を作成したときは必ずsv_2mortalして揮発性にしておく。するとスコープを抜けた位置で自動的に解放される。XSでメモリリークをしないようにする記述方法は以下で解説しています。XSでメモリリークを起こさずプログラムを書く方法Perlでの操作に対応するAPIを発見するXSを書くためにはいつもはPerlで行っている操作をC言語のAPIで行う必要がある。これはなかなか大変だが、perlapiとperlapioに公開されているAPIがすべて載っているのでここから探す。Perlの内部を解説したperlgutsも参考になる。配列の操作に対応するXSでの書き方。newAV();代入。newSVuv(1));要素の取得。av_fetchはSV*へのポインタを返すので*でポインタはずしを行う必要があります。第三引数は要素が存在しなかった場合に作成するかどうかを指定します。av_fetchは要素がなかった場合にNULLを返すので確認してから参照はずしを行う必要があります。&PL_sv_undef;配列のサイズ。newSVuv(1));pop関数。av_pop(av_nums);shift関数。av_shift(av_nums);unshift関数。av_unshiftは値を先頭につけ加えるのではなく、先頭に空の領域を追加するだけなので、av_storeで値を設定する必要があります。newSVuv(1));配列を空に。XSav_clear(av_nums);ハッシュ操作ハッシュの操作に対応するXSでの書き方。strlen("key"));ハッシュの配列の作成XSを最近練習していて、とりあえず次の方針で作成しているが、あっているかはよくわからない。戻り値と引数は一行で書いてしまうPPCODEセクションのみを使う。囲む戻り値はSV*ひとつだけにする。ST(0)に代入してから、XSRETURN(1)。RETVALを使っていないという警告は無視する。SV*、AV*、HV*は作成した直後にsv_2mortalを実行する。これを行わないとメモリリークが発生します。SV*を作成してsv_2mortalしなくてよいのはハッシュや配列の要素にする場合のみ。XSを書くときにしばらくこういう書き方をしてみることにする。XSの文法はかなり複雑なのでできるだけシンプルかつ一貫性のある書き方をしたい。これでどれくらいの場合にうまくいくかをしばらく試してみる。ハッシュの配列の作成ハッシュの配列の作成です。XSRETURN(1);}AV*は配列、HV*はハッシュ。newAVは空の配列の作成。newHVは空のハッシュの作成。hv_storeはハッシュの値の設定、第三引数はキーの長さ、第5引数は0を指定するとハッシュ値を自動で計算される。newRV_incはリファレンスを作成する関数。XSRETURNの引数は戻り値の個数。戻り値はXPUSHsマクロでスタックに積む。ハッシュの配列の作成その2gfxさんのアドバイスを元にしてハッシュの配列の作成を書き直してみました。SV*,AV*,HV*を作った直後に必ずmortalにするという原則、文字列を作成するとき、ハッシュの要素を設定するときに文字数を指定しないようにすること、配列やハッシュの要素にするときはリファレンスカウントをひとつ増やさないといけないこと。あとはできるだけ一貫してシンプルに書くことができるようなマクロを定義してみました。XSRETURN(1);}文字列操作XSにおける文字列操作です。num2);文字列の比較SVである文字列を比較したい場合はsv_cmpを使用します。strNEも用意されています。}パッケージ変数XSにおけるパッケージ変数の操作のための関数を紹介します。パッケージ変数の取得パッケージ変数を取得するには次のように書きます。0);第二引数の0は新しく変数を作成しないことを意味します。パッケージ変数の作成]XSでパッケージ変数を作成する関数を紹介します。get_hvの第二引数で「GV_ADD」を指定します。GV_ADD);正規表現を利用するXSで正規表現を使う方法を解説します。現在、Perlのドキュメントに使用方法が解説されていないので、試し試しでやっているので、間違っていたら教えてください。正規表現のコンパイルXSで正規表現を使用するにはまずpregcomp関数を使って、正規表現をコンパイルする必要があります。これは、正規表現のリファレンスを作成する操作に対応すると考えてください。0);REGEXP*型は、SV*型の一種ですので、実際にコードを利用するときはsv_2mortalを使って、自動的にメモリが解放されるようにしましょう。実際のコードで利用するのを想定して書くと次のようになります。0));正規表現のフラグ正規表現のフラグを、pregcompの第二引数に指定することができます。RXf_PMf_MULTILINE);フラグの対応は以下です。複数指定する場合はビット演算子の論理和「|」で、フラグをつなぎます。正規表現を実行するにはpregexec関数を使用します。pregexec関数の引数は、とても複雑です。文字列に対して正規表現をマッチさせる。*/)マッチが成功した場合は戻り値に真が返ります。サンプルを記述しておきます。0でOK);マッチした文字列の取得マッチした文字列を取得するにはPerl_reg_numbered_buff_fetch関数を使用します。オブジェクト指向関連のAPIオブジェクト指向に関連したXSのAPIを紹介します。オブジェクトを生成するオブジェクトを生成します。モータルにしておきましょう。1));オブジェクトであるかどうかを確認する値がオブジェクトであるかどうかを確認するには、sv_isobject関数を使用します。sv_isobject(sv_obj);あるクラスを継承しているかどうかを確認するあるクラスを継承しているかどうかを確認するにはsv_derived_from関数を使用します。指定したクラスを継承している場合は、真が返ってきます。"MyClass");この関数は、配列のリファレンスであることや、ハッシュのリファレンスであることを確認するのに利用することも可能です。"HASH");ですので、オブジェクトであり、特定のクラスを継承していることを確認するには、sv_isobject関数とsv_derived_from関数を組み合わせて利用します。Perlの内部データ構造とAPIの紹介について書かれています。PerlのAPIの一覧が掲載されています。業務に役立つPerlログ解析など日本語を含むテキスト処理の実践!案内YouTubeでもっと簡単にプログラミングを学ぶならPerlゼミちゃんねるLinuxコマンドを学ぶならLinuxサーバー管理入門Webデザインを学ぶならWebデザイン入門Web開発を始めるななMojoliciousスタートアップブログを作るならGiblogプログラミングの勉強会ならPerl入学式お問合せはこちらPerlは、テキスト処理の記述性とパフォーマンスに優れ、正規表現が言語に組み込まれているプログラミング言語です。Linuxサーバー管理でのフィルタリングプログラム、複数行の文字列を処理、ファイル内容の検索・置換などが得意。Mojoliciousを使ったWebスタートアップも。Perlは、gitやopensslなどUnix/Linuxミドルウェアの支援ツールとして採用されています。このサイトはGiblogで製作されています。