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