C言語でPerlのメソッドを呼び出してみるテスト


前回はC言語からPerlスクリプトを呼び出すだけだった。
今回はC言語からPerlスクリプトのメソッドだけを呼び出す。


main.c

#include <EXTERN.h>
#include <perl.h>

int main(int argc, char **argv){
    PerlInterpreter* my_perl = perl_alloc();
    perl_construct(my_perl);
    char* perl_argv[] = {"", "sample.pl"};

    perl_parse(my_perl, NULL, 2, perl_argv, NULL);

    // スカラー変数が引数のメソッド
    char* scalar_args[] = {"PerlInterpreter", NULL};
    call_argv("scalar_argument", G_DISCARD | G_VOID, scalar_args);

    // リスト変数が引数のメソッド
    char* array_args[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", NULL};
    call_argv("array_argument", G_DISCARD | G_ARRAY, array_args);

    // ハッシュ変数が引数のメソッド
    char* hash_args[] = {"key1", "1", "key2", "2", "key3", "3", NULL};
    call_argv("hash_argument", G_DISCARD | G_ARRAY, hash_args);

    perl_destruct(my_perl);
    perl_free(my_perl);

    return 0;
}


sample.pl

#!/usr/bin/perl

use strict;


sub scalar_argument {
    my($scalar) = @_;

    printf("%s\n", $scalar);
}

sub array_argument {
    my(@array) = @_;

    foreach my $data (@array){
        printf("%s\n", $data);
    }
}

sub hash_argument {
    my(%hash) = @_;

    foreach my $key (sort(keys(%hash))){
        printf("%s => %s\n", $key, $hash{$key});
    }
}


コンパイル

$ cc -o callsub main.c `perl -MExtUtils::Embed -e ccopts -e ldopts`


実行

$ ./callsub


結果

PerlInterpreter
1
2
3
4
5
6
7
8
9
key1 => 1
key2 => 2
key3 => 3


余談だが、このプログラムだとBEGINは実行されるが、ENDは実行されない。
perl_parse関数でPerlの解析を行う。つまりPerlで言うところのuseと同じ。
で、perl_runメソッドでPerlスクリプト自体を実行するので
このプログラムではENDは実行されない。