前回の
お試し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の関数が値を返すように修正しただけで、
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/168ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-13000-8
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現! - 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう - 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT