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