perl で XS モジュールを作成する (C ライブラリの関数を呼び出す)

perl から C 言語ライブラリの関数を呼び出したかったので、XS 言語を使ってみた。
今回は、引数で渡したアルファベットの文字を小文字から大文字に変えるというもの。

1. テンプレートを作成する

h2xs コマンドで各ファイルを生成する。

$ h2xs -A -n Foo
Writing Foo/Foo.pm
Writing Foo/Foo.xs
Writing Foo/Makefile.PL
Writing Foo/README
Writing Foo/test.pl
Writing Foo/Changes
Writing Foo/MANIFEST

2. C のソースコードを書く

Foo.xs に C で行う処理を記述する。

$ cat Foo.xs
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include <ctype.h>

MODULE = Foo            PACKAGE = Foo

int
foo_upcase(s)
char *s
CODE:
    for (; *s; s++) {
        if (isalpha(*s))    *s = toupper(*s);
    }

    RETVAL = 0;
OUTPUT:
    RETVAL

3. コンパイルする & テストを実行する

$ perl Makefile.PL
$ make
$ make test

4. サンプルプログラムを書く

$ cat foo.pl
#!/usr/bin/perl -w

use strict;
use warnings;

use ExtUtils::testlib;
use Foo;

my $s = "abcd" . "\0";

Foo::foo_upcase($s);

print "result: $s\n";

5. サンプルプログラムを実行してみる

$ ./foo.pl
result: ABCD