2014-04-06 11 views
7

Ho programmato C per un po '. Ora ho bisogno di scrivere un programma C che Perl possa chiamare. Dovrebbe avere la stessa sintassi della seguente funzione dummy perl: prendere due input, entrambi sono stringhe (possono contenere caratteri binari, anche "\ x00"), generare una nuova stringa.come scrivere una funzione C ed essere in grado di chiamarlo da perl

Naturalmente, l'algoritmo della funzione sarà più complesso, è per questo che ho bisogno di farlo in C.

sub dummy { 
    my ($a, $b) = @_; 
    return $a . $b; 
} 

ho brevemente guardato SWIG per l'attuazione, ma tenendo input/ouput diverso un numero intero non è facile, spero che qualcuno possa dare un esempio concreto.

Grazie in anticipo.

UPDATE: ottenuto un ottimo esempio da Rob (autore del modulo Inline :: C in cpan), grazie!

############################## 
use warnings; 
use strict; 
use Devel::Peek; 

use Inline C => Config => 
BUILD_NOISY => 1, 
; 

use Inline C => <<'EOC'; 

SV * foo(SV * in) { 
SV * ret; 

STRLEN len; 
char *tmp = SvPV(in, len); 
ret = newSVpv(tmp, len); 
sv_catpvn(ret, tmp, len); 
return ret; 

} 

EOC 

my $in = 'hello' . "\x00" . 'world'; 
my $ret = foo($in); 


Dump($in); 
print "\n"; 
Dump ($ret); 

############################## 

risposta

11

Perl ha un linguaggio di colla XS per questo genere di cose. Conosce le associazioni tra tipi di dati Perl e tipi C. Ad esempio, una funzione C

char *dummy(char *a, int len_a, char *b, int len_b); 

potrebbe essere avvolto dal codice XS

MODULE = Foo PACKAGE = Foo 

char * 
dummy(char *a, int length(a), char *b, int length(b)); 

sarà compilato Il file Foo.xs quando è installato il modulo, tutte le catene strumento di compilazione rilevanti hanno il supporto per XS.

Argomento codice di conversione viene generato automaticamente, in modo che la funzione può essere chiamata in Perl come Foo::dummy("foo", "bar"), una volta che il codice XS è stato caricato da Perl:

package Foo; 
use parent 'DynaLoader'; 
Foo->bootstrap; 

C'è un XS tutorial nella documentazione Perl, e documentazione di riferimento in perlxs.

XS è una buona scelta per i moduli, ma è scomodo per gli script one-off. Il modulo Inline::C consente di incorporare il codice colla C direttamente nello script Perl e si occuperà della compilazione automatica ogni volta che il codice C cambia. Tuttavia, con questo approccio è possibile generare meno codice automaticamente.

+0

Grazie per la risposta rapida e il collegamento. Sembra che Inline :: C abbia ridotto il dolore dell'uso di perlx per qualcuno che non conosce il perl guts. C'è un libro di cucina con numerosi esempi sull'uso di Inline :: C: https://metacpan.org/pod/Inline::C-Cookbook. – packetie

Problemi correlati