2010-10-05 2 views
5

Desidero incorporare un codice C in Perl. In questo codice C voglio leggere un enorme file in memoria, apportare alcune modifiche e costruire un hash (uno personalizzato). Desidero rendere questo hash accessibile dal mio codice Perl. È possibile? Come posso raggiungere l'obiettivo?Come posso costruire un hash Perl nel codice C?

risposta

3
  • Vedi Internals and C language interface
  • hanno anche uno sguardo al Inline-C per embedded un codice C in Perl: Il Inline module consente al codice sorgente put da altre linguaggi di programmazione direttamente "inline" in uno script Perl o modulo . Il codice viene compilato automaticamente come necessario, quindi caricato per l'accesso immediato a da Perl.

visualizzato anche Why should I use Inline to do it?

+0

Oh, per favore smetti di raccomandare Inline come la soluzione standard di fatto a queste cose. È un incubo di dispiegamento. A meno che il requisito sia specificamente "Ho bisogno di farlo solo sulla mia macchina e sulla mia macchina", Inline si traduce in problemi lungo la strada. – tsee

+0

Scriverò codice XS quando devo, ma quando non devo, Inline :: C è fantastico. – mob

1

È possibile utilizzare SWIG di interfaccia tra C, Perl, e molte altre lingue.

11

Per incorporare c in perl, stai cercando XS. Un'ampia documentazione è reperibile su perlxs e perlxstut.

Per quanto riguarda la costruzione di strutture dati perl da C, sarà necessario utilizzare le parti di perlapi che gestiscono gli hash. Molta documentazione su XS già spiega vari frammenti di questo. Le parti importanti che stai cercando sono newHV e hv_store.

Ecco un piccolo (e completamente non testato) esempio di qualcosa di simile a ciò che si potrebbe desiderare di fare:

SV * 
some_func() 
    PREINIT: 
     HV *hash; 
    CODE: 
     hash = newHV(); 
     hv_stores(hash, "foo", 3, newSViv(42)); 
     hv_stores(hash, "bar", 3, newSViv(23)); 
     RETVAL = newRV_noinc((SV *)hash); 
    OUTPUT: 
     RETVAL 

Questa è una subroutine XS chiamato some_func, che sarà costruire un hash e restituire un riferimento ad esso to perl space:

my $href = some_func(); 
# $href = { foo => 42, bar => 23 };