2010-10-05 26 views
5

Deseo insertar un código C en Perl. En este código C, quiero leer un gran archivo en la memoria, hacer algunos cambios y crear un hash (uno personalizado). Deseo hacer accesible este hash desde mi código Perl. ¿Es posible? ¿Cómo puedo alcanzar el objetivo?¿Cómo puedo construir un hash Perl en código C?

Respuesta

3
  • Ver Internals and C language interface
  • también echar un vistazo a Inline-C para incrustado un código C en Perl: El Inline module que permite al código fuente aportaciones de otras lenguajes de programación directamente "en línea" en un script Perl o módulo . El código se compila automáticamente como necesario, y luego se carga para el acceso inmediato desde Perl.

Lea también Why should I use Inline to do it?

+0

Por favor, deje de recomendar Inline como la solución estándar de facto para tales cosas. Es una pesadilla de implementación. A menos que el requisito sea específicamente "Necesito hacer esto en mi máquina y mi máquina solamente", Inline se traduce en problemas en el futuro. – tsee

+0

Escribiré el código XS cuando sea necesario, pero cuando no es necesario, Inline :: C es increíble. – mob

1

Puede utilizar SWIG hacer de interfaz entre C, Perl, y varios otros idiomas.

11

Para incrustar c en perl, está buscando XS. Se puede encontrar una amplia documentación sobre esto en perlxs y perlxstut.

En cuanto a la construcción de estructuras de datos perl desde C, tendrá que usar las partes del perlapi que se ocupan de los hashes. Mucha documentación sobre XS ya explica varios bits de eso. Las partes importantes que estás buscando son newHV y hv_store.

Aquí hay una pequeña (y no está comprobado) ejemplo de algo similar a lo que es posible que desee hacer:

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 

Esa es una subrutina XS llamada some_func, que va a construir un hash y devolver una referencia a ella perl space:

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