Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写C函数并能够从perl调用它_Perl - Fatal编程技术网

如何编写C函数并能够从perl调用它

如何编写C函数并能够从perl调用它,perl,Perl,我编写C语言已经有一段时间了。现在我需要编写一个perl可以调用的C程序。 它应该具有与以下伪perl函数相同的语法:获取两个输入,都是字符串(可能包含二进制字符,甚至“\x00”),输出一个新字符串 当然,函数的算法会更复杂,这就是为什么我需要用C语言来实现它 sub dummy { my ($a, $b) = @_; return $a . $b; } 我已经简要介绍了SWIG的实现,但是获取整数以外的输入/输出并不容易,希望有人能给出一个具体的例子 提前谢谢 更新:从Ro

我编写C语言已经有一段时间了。现在我需要编写一个perl可以调用的C程序。 它应该具有与以下伪perl函数相同的语法:获取两个输入,都是字符串(可能包含二进制字符,甚至“\x00”),输出一个新字符串

当然,函数的算法会更复杂,这就是为什么我需要用C语言来实现它

sub dummy {
    my ($a, $b) = @_;
    return $a . $b;
}
我已经简要介绍了SWIG的实现,但是获取整数以外的输入/输出并不容易,希望有人能给出一个具体的例子

提前谢谢

更新:从Rob(cpan中内联::C模块的作者)那里得到了一个很好的例子,谢谢

##############################
使用警告;
严格使用;
使用Devel::Peek;
使用内联C=>Config=>
BUILD_Noised=>1,
;

使用内联C=>Perl有一种称为XS的粘合语言来实现这类功能。它知道Perl数据类型和C类型之间的映射。例如,一个C函数

char *dummy(char *a, int len_a, char *b, int len_b);
可以由XS代码包装

MODULE = Foo    PACKAGE = Foo

char *
dummy(char *a, int length(a), char *b, int length(b));
安装模块时将编译
Foo.xs
文件,所有相关的构建工具链都支持xs

参数转换代码将自动生成,以便从Perl加载XS代码后,可以在Perl中调用函数作为
Foo::dummy(“Foo”,“bar”)

package Foo;
use parent 'DynaLoader';
Foo->bootstrap;
在perl文档中有一个参考文档,在中有一个参考文档


XS对于模块来说是一个不错的选择,但是对于一次性脚本来说却很难使用。该模块允许您将glue C代码直接嵌入到Perl脚本中,并在C代码更改时负责自动编译。但是,使用这种方法可以自动生成较少的代码。

感谢您的快速回复和链接。对于不懂perl的人来说,Inline::C似乎减轻了使用perlxs的痛苦。有一本关于如何使用Inline::C的食谱,其中有很多例子。
package Foo;
use parent 'DynaLoader';
Foo->bootstrap;