Inline::Cで学ぶperlguts(その8)
ハッシュリファレンスを使わないと引数が多くなってしまうので、
前回に引き続き、調べたことをメモ。
use v5.14;
use strict;
use warnings;
use Data::Dumper;
use Inline C => q{
#include <stdio.h>
SV * hoge(SV *params)
{
if ( SvROK(params) == 0 ) {
printf( "error!\n" );
return newSViv( -1 );
}
IV foo = 0, bar = 0;
HV *hv = (HV *)SvRV( params );
SV **pp = NULL;
pp = hv_fetch( hv, "foo", strlen("foo"), 0 );
if ( pp ) {
foo = SvIV( *pp );
}
else {
printf( "foo not exist!\n" );
return newSViv( -1 );
}
pp = hv_fetch( hv, "bar", strlen("bar"), 0 );
if ( pp ) {
bar = SvIV( *pp );
}
else {
printf( "bar not exist!\n" );
return newSViv( -1 );
}
return newSViv( foo * bar );
}
};
say "Error pattern!";
say hoge( +{} );
say "=-=-=-=-=-=-=-=-=-=";
say "OK pattern!";
say hoge( +{
foo => 2,
bar => 3
} );
実行するとこんな感じ。
$ perl aaa.pl Error pattern! foo not exist! -1 =-=-=-=-=-=-=-=-=-= OK pattern! 6
ハッシュリファレンスでいくつかの値を入力して、
一応、有無のチェックを行って、処理した結果を返している。
実際は、Inline-Cで定義している関数はオープンにしないので、
もっとラフに書く予定。
おしまい!
Leave a Comment