2010-11-15 13 views
15

Ten problem jest tak prosty, że czuję nadchodzące RTFM. Jednak cały ranek przyglądałem się dokumentom (Inline, Inline-C, Inline-C-Cookbook) i nie wiem, jak rozwiązać ten problem.Perl: jak mogę umieścić cały mój wbudowany kod C w osobnym pliku?

Chcę użyć wbudowanego C, ale nie chcę mieć kodu C w tym samym pliku co mój kod Perla.

(Emacs nie lubi mieć dwóch języków w jednym pliku.) Zasadniczo jest to kwestia wygody, ale w praktyce muszę edytować moje C w jednym pliku, a następnie skopiować i wkleić do mojego skryptu Perla.) Perl

Tu pracuje:

#!/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; 
} 

(dzięki mobrule za wprowadzenie mnie to daleko)

Chcę przenieść cały kod C (lub tyle, ile jest to możliwe) do a. oddzielny plik nagłówkowy.

Co mogę zrobić, to umieścić sum1 w nagłówku, a to zrobić:

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

double sum2(AV* array) { 
    sum1(array); 
} 

Jest wystarczająco dobry, jak ja nie mają już edycję C w Perl-mode, ale zastanawiam się, czy tam isn czy jest to bardziej eleganckie rozwiązanie tego problemu?

+0

To wygląda całkiem elegancko. –

+0

@Pedro Silva oko patrzącego i tak dalej. wydaje mi się trochę zbędny. – flies

Odpowiedz

21

można umieścić swój kod C w osobnym pliku i użyć Inline::bind załadować go w czasie wykonywania

use Inline; 
use File::Slurp; 

my $data = read_file('source.c'); 
Inline->bind(C => $data); 

lub ładowanie kodu źródłowego w BEGIN {} bloku związać go w czasie kompilacji

my $data; 
use File::Slurp; 
BEGIN { 
    $data = read_file('source.c'); 
} 
use Inline C => $data; 
+1

dzięki! Zaskoczyło mnie, że to rozwiązanie nie rekompiluje się przy każdym wykonaniu. Inline jest inteligentne! – flies

2

Przynajmniej z ostatnimi wersjami Inline, możesz po prostu podać nazwę pliku zamiast ciągu znaków podczas używania Inline:

use Inline C => "./test.c"; 

Ograniczeniem jest tutaj to, że Inline :: C używa prostego podejścia do wyrażenia regularnego, aby określić, czy jego argument "wygląda jak", dlatego część "./" jest ważna. Warto również zacząć od pliku C z dyrektywą #line 1 test.c, aby debugger C wiedział o tym.

Powiązane problemy