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は実行されない。