Inline::Cで学ぶperlguts(その8)
ハッシュリファレンスを使わないと引数が多くなってしまうので、
前回に引き続き、調べたことをメモ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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