在Perl 中使用内联新的 Perl 内联模块允许您使用其他语言编写代码(如C、Python、Tcl 或 Java),并将其随意地放进 Perl 脚本中。不像以前将C 语言代码与 Perl进行连接的方法那样,内联的使用将非常简便,尤其是在与 Perl体系保持一致方面更加出色。内联的一个非常实用的地方是可以依据 C语言的库编写出快速包装代码并将在 Perl上使用它,这样(就我而言)就可以将 Perl变成世界上 最好的测试平台。 Perl 一向是比较折衷的,这样显得它很可怜,但是直到今天,要让 Perl 使用其它语言或不是特别为它构造的库并非很容易。您必须用 XS 语言来编写接口代码(或让 SWIG 来帮您编写),接着构造一个有序的模块,随后通常还有很多细节需要处理。 但是现在情况就不一样了。由 Brian Ingerson 编写并积极( 非常积极)维护的内联模块提供了将其它语言绑定到 Perl 上的工具。此外,如果在 Perl 文件中有需要出现、创建和以一种完全透明的方式动态装载其它语言的地方,Perl 的子模块(Inline::C、Inline::Python、Inline::Tcl、Inline::Java、Inline::Foo 等)允许您 直接在 Perl 文件中嵌入那些语言。使用您脚本的用户不会看出其中的不同,只不过第一次调用使用内联的代码时,程序将多花一点时间来完成对嵌入代码的编译。 世界上最简单的 Inline::C 程序 为了向您说明我的用意,让我们来看看最简单可行的内联程序;这个程序使用了内嵌的 C 语言函数,不过您完全可以用其它支持内联的语言来实现同样的功能。 清单 1. 内联 "Hello, world"
当然,这段代码的 功能很明显。它定义了一个 C 语言的函数来完成预期的任务,然后又将它作为一个 Perl 函数来处理。换句话来说, 内联所实现的恰好就是一个扩展模块所应该实现的内容。也许您心中最想问的问题就是,“它是如何 实现的?”其实答案和您预计的差不多:内联得到您的 C 语言代码,然后在它基础上构建一个 XS 文件,就像一个人工的扩展模块编写器所执行的一样,接着创建那个模块,然后装载它。接下来的代码调用就会很容易找到以前构建过的那个模块,然后直接装载它。 您甚至可以使用 与 XS 和 SWIG 相比较 与不使用内联的同样接口相对比。如果您要从 Perl 中调用 C 语言代码,您必须使用 在这整个的过程中,SWIG 是一个非常有用的工具,它可以被用来为您生成大量的 XS 代码。但是,SWIG 分析 C 语言头文件的能力并不是很强,所以它能做的也很有限。对于更复杂的项目来说,您必须手工编码至少一部分函数,以便让 SWIG 知道该做什么。然后,如果您希望完成任何的特殊处理(也许您希望有一个简单的 Perl 函数,它可以根据您传递的参数数目或种类来调用不同的 C 语言函数),您就可以最终更改它的输出。 但这样更糟,是真的。XS 只能生成 C 语言代码,而 SWIG 只能工作在 C(或 C++)的包含文件上,以生成它的输出。这就意味着,如果要在其它语言(如 Python)中连接代码,您必须首先 用 C 语言编写包装代码来调用 Python 代码,然后用 XS 对它进行再一次的包装,最后 XS 会用 Perl 来包装它。这样的话,您必须要非常熟悉 Perl 和 C,以及它们之间是怎么样互相作用的, 还要非常熟悉您的目标语言,以及它与 C 语言之间是怎么样相互作用的。 在另一个方面,情况更糟糕:您的潜在用户(如果您想分发您的代码)必须觉得,在 Perl 中取得您的模块并安装它不是件很麻烦的事。如果要在 UNIX 下安装,您的用户还得有根权限或者至少一部分的管理权限,因为模块是要被安装到 Perl 自身的库文件目录中去的。换句话说,您的目标用户不能只是普通用户。那样的话,要问的事情就太多了。 如果有了内联,情况就大不相同了。每一种语言模块都知道怎么样读取它们各自的语言从而找到相应的函数定义,怎么样编写 XS 和 C 包装代码从而调用它们(或是在遇到如 Python 的解释型语言时知道怎么样去调用解释器),以及怎么样去安装这一整套东西。最好的是,您的 Perl 脚本的最终用户将不会看到任何有关这些的显示。 唯一的真正要求是,所需的语言确实被完全安装了。在 C 语言下,这意味着用来创建 Perl 安装的编译器还能够使用。在 UNIX 下这几乎不是问题;在 Windows 下也许存在问题,因为几乎所有 Windows 的 Perl 用户都使用 ActiveState Perl,它是用 Microsoft Visual C++ 6.0 来编译的(直到撰写本文时)。如果编译器是 上一篇:Awk 实例(三) 下一篇:程序编译中怎么样调试configure 更多相关文章
|
推荐文章
精彩文章
|