Perl:如何将所有内联C代码放入单独的文件中?

fli*_*ies 17 c perl inline

这个问题很简单,我可以感受到RTFM的到来.但是,我整个上午都在看文档(Inline,Inline-C,Inline-C-Cookbook),我无法弄清楚如何解决这个问题.

我想使用内联C,但我不想在与perl代码相同的文件中使用C代码.

(Emacs不喜欢在一个文件中使用两种语言.原则上这是方便的,但实际上我必须在一个文件中编辑我的C然后将其复制粘贴到我的perl脚本中.)

这是工作perl:

#!/usr/bin/perl

use Inline C => DATA;
use strict;
use warnings;
use List::Util qw(sum);
use feature qw(say);

my @array = (1..10);
say "native perl: ", sum(@array), ", Inline C: ", sum1(\@array);

__END__
__C__

double sum1(AV* array) {
  int i;
  double sum = 0.0;
  for (i=0; i<=av_len(array); i++) {
    SV** elem = av_fetch(array, i, 0);
    if (elem != NULL)
      sum += SvNV(*elem);
  }
  return sum;
}
Run Code Online (Sandbox Code Playgroud)

(感谢mobrule让我这么远.)

我想将所有C代码(或尽可能多的)移动到单独的头文件中.

我可以做的是放入sum1标题,并执行此操作:

# same perl as above except now say sum2 instead of sum1
__END__
__C__
#include "sum.h"

double sum2(AV* array) {
    sum1(array);
}
Run Code Online (Sandbox Code Playgroud)

这已经足够好了,因为我不再需要在perl模式下编辑C,但我想知道这个问题是否没有更优雅的解决方案?

mob*_*mob 22

您可以将C代码放在单独的文件中,并用于Inline::bind在运行时加载它

use Inline;
use File::Slurp;

my $data = read_file('source.c');
Inline->bind(C => $data);
Run Code Online (Sandbox Code Playgroud)

或者在BEGIN {}块中加载源代码以在编译时绑定它

my $data;
use File::Slurp;
BEGIN {
    $data = read_file('source.c');
}
use Inline C => $data;
Run Code Online (Sandbox Code Playgroud)