perl如何调用其它编程语言(如C)

perl如何调用其它编程语言(如C)

问题描述:
unix环境下,在perl中
1、如何调用一个标准C函数。
2、如何调用一个4gl编写的函数。
3、如何调用一个操作系统函数或系统调用。
1,3 use POSIX; 一般都能解决。

2不会。
Inline::C
先用precompiler將4GL的東西..precompiler成C的程序..
再用Inline::C包起來...
應該就可以了...
我也常用Informix..但是我比較常用DBD/DBI與esql...
还是这个问题,高手帮忙看看。

我描述的详细一点。

Makefile.PL内容如下:

[Copy to clipboard] [ - ]
CODE:
use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
    'NAME'              =>; 'Mytest',
    'VERSION_FROM'      =>; 'Mytest.pm', # finds $VERSION
    'PREREQ_PM'         =>; {}, # e.g., Module::Name =>; 1.1
    'LIBS'              =>; [''], # e.g., '-lm'
    'DEFINE'            =>; '', # e.g., '-DHAVE_SOMETHING'
    'INC'               =>; '', # e.g., '-I/usr/include/other'
);
~

Mytest.PM的内容如下:

[Copy to clipboard] [ - ]
CODE:
package Mytest;

require 5.005_62;
use strict;
use warnings;

require Exporter;
require DynaLoader;

our @ISA = qw(Exporter DynaLoader);

# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.

# This allows declaration       use Mytest ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our %EXPORT_TAGS = ( 'all' =>; [ qw(

) ] );

our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw(

);
our $VERSION = '0.01';

bootstrap Mytest $VERSION;

# Preloaded methods go here.

1;
__END__
# Below is stub documentation for your module. You better edit it!

=head1 NAME

Mytest - Perl extension for blah blah blah

=head1 SYNOPSIS

  use Mytest;
  blah blah blah
=head1 DESCRIPTION

Stub documentation for Mytest, created by h2xs. It looks like the
author of the extension was negligent enough to leave the stub
unedited.

Blah blah blah.

=head2 EXPORT

None by default.


=head1 AUTHOR

A. U. Thor, a.u.thor@a.galaxy.far.far.away

=head1 SEE ALSO

perl(1).

=cut

Mytest.xs内容如下:

[Copy to clipboard] [ - ]
CODE:
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

MODULE = Mytest         PACKAGE = Mytest

上面这个是大体的框架,我现在自己写了一个c函数,例如:

[Copy to clipboard] [ - ]
CODE:
#include <stdio.h>;

static int testfun( int );

int main( void )
{
    (void)fprintf(stderr,"Sample for test.\n");
    if( testfun( 100 ) < 0 ) {
        (void)fprintf(stderr,"testfun error!\n");
        exit(-1);
    }
    exit(0);
}

int testfun(int num )
{
    if( num >; 0 )
        printf("Int num = %d\n", num );
    else
        return -1;
    return 0;
}

现在如何在上面那几个文件中添加,让perl可以执行c的函数。
例如我现在想些个perl的脚本来执行c的函数testfun。

具体怎么做

perl Makefile.Pl后生成了makefile,这一步也没有报错。
我的测试环境是linux。
up!
根據我先前trace XML:arser的經驗..
你的Mytest.xs就可以把C的function寫在裡面..
注意的是..每個function前面要加上Package名稱..
例如Mytest_main()
在xs裡面不需要定義main()
因為這裡只是要借用C的一些語法...
然後在PM裡面..可以直接用
$a = main();
經由DynaLoader會自動幫你呼叫c的function...
另外你可以發現...在Mytest.PM中呼叫的function
並沒有Package的名稱....
你有興趣可以抓那個XML:arser的module下來研究一下..
他也有用到C的東西...因為我用不到..所以沒深入研究過..

MODULE = Mytest         PACKAGE = Mytest
這行要拿掉
谢谢apile兄,你有perl调用C函数的例子吗?

有的话,发到cobrakings@263.net


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl -w

use Inline C;

say();

__END__
__C__
void say()
{
        puts("hello!");
}