Perl Hackers Hub
第53回 Cを用いたPerl拡張入門―Inline::Cで体験してみよう!(2)
前回の
お試しInline::C
では,
この回では,
my $ret = add(1, 2);
printf "result: %d\n", $ret;
sub add {
return $_[0] + $_[1];
}
実行結果は次のとおりとなります。
result: 3
上記で定義したPerlのadd
サブルーチンで注目すべきポイントとして,
- 引数を2つ受け取る
- それらの値を用いて計算した結果を返す
PerlとCの間で値の受け渡しがどう行われるのかを,
Inline::Cのインストール
Inline::Cは,
$ cpanm Inline::C
スクリプトで書くHello, World
Inline::Cを用いて,Hello, World
を出力するCのコードを書いてみましょう。
use Inline C;
greet();
__END__
__C__
void greet() {
printf("Hello, World\n");
}
今までCを書いたことがある人は,stdio.
などのヘッダファイルの宣言を記述しないことに違和感を感じるかもしれません。Inline::Cはperl.
など,
上記のコードからわかるように,
use Inline C;
# Perlのコードはここに書く
__END__
__C__
/* C のコードはここに書く */
また,
use Inline C => <<'...';
/* C のコードはここに書く */
...
# Perlのコードはここに書く
これらの例で,BEGIN
を用いる必要があります。
ワンライナーで書くHello, World
Inline::Cはワンライナーでも使用できます。
通常Perlモジュールを扱う場合は,
$ perl -Mモジュール名 -e '# Perl のコード'
しかしInline::Cの場合は,use
を使わなければいけません。
$ perl -e 'use Inline C=>q{void greet(){printf("Hello, World\n");}};greet'
CとPerl間のやりとり
本稿では触れませんが,
本来ならCのコードを書く際にSVの値を直接操作して整数値を取り出すなどしないといけないのですが,
Perlの値をCへ渡す
本節の冒頭で挙げた足し算を行うコードをCで実装するには,
use Inline C;
add(1, 2);
__DATA__
__C__
void add(int i, int j) {
int add = i + j;
printf("result: %d\n", add); /* result: 3 と表示 */
}
Perl側ではいつもどおりサブルーチンへ引数を渡しています。Cのコードでも普段どおりに,
Cの値をPerlへ渡す
Cのコードで生成した値をPerlの世界でも扱いたいはずです。Cで生成した値をPerlの世界へ渡してみましょう。ここでも特別に難しい考えは必要としません。
先ほど記述した引数のコードを少し修正して,
use Inline C;
my $ret = add(1, 2); # 戻り値を変数へ渡す
printf "result: %d\n", $ret; # result: 3 と表示
__DATA__
__C__
int add(int i, int j) {
return i + j; /* 足し算した結果を返す */
}
Cの関数が値を返すように修正しただけで,
- 注1)
- もちろんXSでもtypemapを扱えます。
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.122
2021年4月24日発売
B5判/168ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-12119-8
- 特集1
上から下まで全レイヤ解説! 複雑化した世界を体系的に学ぶ
Web技術総整理 - 特集2
新バージョン登場! PythonによるWeb開発の基本
はじめてのDjango - 特集3
Rustで実装!
作って学ぶRDBMSのしくみ
バックナンバー
Perl Hackers Hub
- 第66回 モジュールによる時間の多様な取り扱い(2)
- 第66回 モジュールによる時間の多様な取り扱い(1)
- 第65回 依存モジュールの更新 ―update-cpanfile,GitHub Actionsで実現!(2)
- 第65回 依存モジュールの更新 ―update-cpanfile,GitHub Actionsで実現!(1)
- 第64回 少しマニアックなPerlのテクニック―特殊変数,低レベルの標準関数を使いこなす(2)
- 第64回 少しマニアックなPerlのテクニック―特殊変数,低レベルの標準関数を使いこなす(1)
- 第63回 PPIとPerl::Tidyを組み合わせて作るコード整形ツール(2)
- 第63回 PPIとPerl::Tidyを組み合わせて作るコード整形ツール(1)
- 第62回 Perl歴史散策 ―インタプリタの実装と,構文の進化をたどる(3)
- 第62回 Perl歴史散策 ―インタプリタの実装と,構文の進化をたどる(2)