Cómo incrustar Perl en un programa C
Además, cada programa en C que use Perl debe vincularse con la biblioteca de Perl. La biblioteca Perl es una colección de programas C compilados en un archivo ejecutable Perl (/usr/bin/perl o similar). (Conclusión: si Perl no está compilado o instalado correctamente en el sistema, no puede compilar un programa C con Perl incorporado. Una instalación incorrecta significa que solo se copia el ejecutable binario de Perl, no el directorio de la biblioteca de Perl).
Cuando usas Perl en C, tu programa C generalmente crea, ejecuta y destruye un intérprete de Perl
Si tu versión de Perl es lo suficientemente nueva como para incluir esta documentación (versión 5.002 o más reciente), bibliotecas Perl (y EXTERN.h y perl.h, esto es todo lo que necesita). h, los necesitará) en el siguiente directorio:
/usr/local/lib/perl5/your_architecture_here/CORE
o simplemente
/usr/ local/lib/perl5/your_architecture_here/CORE
/USR/local/lib/perl5/your_architecture_here/CORE
Biblioteca Perl (y EXTERN.h y perl.h que necesitará, esto es todo lo que necesitas) estará en un directorio como CORE
O posiblemente en un directorio como
/usr/opt/perl5/CORE
Ejecute esto expresión para ubicar este directorio:
perl -MConfig -e 'print $Config{archlib}'
Así es como se compila el código de ejemplo en la siguiente sección: Agregar declaraciones del intérprete de Perl a la pared del programa C, que se ve así en mi máquina Linux:
% gcc -O2 -Dbool=char -DHAS_BOOL -I/usr/local/include -I /usr/local/lib /perl5/i586-linux/ 5.003/CORE -I/usr/local/lib/perl5/i586-linux/5.003/CORE -o interp interp.c -lperl -lm
(Estos son una línea .) En mi máquina DEC Alpha que ejecuta una versión anterior de perl 5.003_05, la situación es ligeramente diferente:
% cc -O2 -Olimit 2900 -DSTANDARD_C -I /usr/local/include -I/usr /local/lib/perl5/alpha-dec_osf/5.00305/CORE -L/usr/local/lib/perl5/alpha-dec_osf/5.00305/CORE -L/usr/local/ lib -D__LANGUAGE_C__ -D_NO_PROTO -o interp interp.c -lperl -lm
¿Cómo saber qué se debe completar? Si su versión de Perl es superior a 5.001, ejecute el comando perl -V y anote la información sobre `cc'' y `ccflags''.
Debes elegir el compilador adecuado para tu sistema.
(perl -MConfig -e 'print $Config{cc}' le dirá qué compilador usar (cc, gcc, etc.).
También debe seleccionar el directorio de biblioteca Perl correcto para su sistema ( /usr/local/lib/...). Si el compilador se queja de que hay funciones no definidas o no se puede encontrar -lperl, entonces debe especificar la ruta del archivo de la biblioteca manualmente con -L. h y perl.h, debe especificar la ruta del archivo de encabezado manualmente con -I
¿Qué otras bibliotecas podría necesitar agregar
Perl -MConfig -e 'print $Config? {archlib}'
Si su configuración de Perl está instalada correctamente, el módulo ExtUtils::Embed detectará toda la información requerida por usted
% cc -o interp interp .c `. perl -MExtUtils::Embed -e ccopts -e ldopts`
Si ExtUtils::Embed no está incluido en su distribución de Perl, puede descargarlo desde /perl/CPAN/modules/by- module/ExtUtils /. (
ExtUtils::Embed en CPAN contiene todo el código fuente, pruebas y otros programas de muestra útiles para este artículo.
------- ---- ---------------------------------------------- ---- -------------------
Agregar un intérprete de Perl a su programa C
En general, perl (fuente C) es es un buen ejemplo de incorporación de Perl, así que demostraré un miniperlmain.c, que no es muy estándar ni elegante, por supuesto
#include
static PerlInterpreter *my_perl /* ** Intérprete de Perl***/
int main(int argc, char **argv, char **env) { my_perl = perl_alloc( ); , argv, (char **)NULL); perl_run(my_perl); perl_destruct(my_perl); perl_free(my_perl); }
Nota: no utilizamos el puntero env. Generalmente, como última opción para perl_parse, el parámetro env es NULL, lo que significa que se utilizarán las variables de entorno actuales.
Ahora compílelo (lo llamé interp.c) en un archivo ejecutable:
% cc -o interp.c `perl -MExtUtils::Embed -e ccopts - e ldopts `
Después de una compilación exitosa, puedes usar interp como perl. Utilice interp.
% interp print "Bastante bueno Perl \n"; print "10890 - 9801 es ", 10890 - 9801
O
% interp -e 'printf("%x", 3735928559)' deadbeef
También puedes leer el archivo reemplazando argv[1] antes de llamar a perl_fun, luego ejecutar Perl código en un programa C.
------------------------------------------- ----- -------------------------------------
Llamando Perl desde un programa C Subrutinas
Para llamar a subrutinas Perl individuales, puede utilizar cualquiera de los tipos perl_call_* que se encuentran en el
Se mostrarán a continuación en un programa al que llamo showtime.c.
#include
PerlInterpreter estático *my_perl;
int main(int argc, char **argv , char ** env) { char *args[] = { NULL }; NULL);
/*** Omitir perl_run()***/
perl_call_argv("showtime", G_DISCARD | G_NOARGS, args);
perl_destruct (my_perl); perl_free(my_ perl); }
showtime es una subrutina de Perl que no requiere parámetros. (es G_NOARGS) e ignoraré su valor de retorno (es G_DISCARD). Estas banderas y algunas otras están en el manual de perlcall.
Definiré la función showtime en el archivo
print "No seré impreso.";
sub showtime { print time }
Muy simple. Ahora compila y ejecuta:
% cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
% showtime showtime.pl 818284590
Cuando ejecuto una declaración de programa, devuelve la hora desde el 1 de enero de 1970 (el comienzo de la época Unix) hasta el presente.
En esta sección no necesitamos llamar a perl_run, pero generalmente una buena práctica de programación es garantizar que la biblioteca se use correctamente, incluida la llamada al método DESTROY de todos los objetos y al END {} de los bloques de código.
Si desea pasar argumentos a una función de Perl, puede completar la tabla de argumentos con argumentos terminados en NULL perl_call_argv. Necesita manipular la pila de Perl para obtener otros tipos de datos o probar valores de retorno. Esto se analiza en la última sección de este documento: Manipulación de la pila de Perl en programas C.
------------------------------------------- -- -------------------------------------
Ejecutar Perl en C expresiones del programa
Perl proporciona dos funciones API para ejecutar fragmentos de código Perl. Son perl_eval_sv y perl_eval_pv.
Normalmente, sólo necesitas ejecutar un fragmento de código Perl en tu programa. Este código puede ser tan largo como desee: puede contener use, require y do para incluir otros archivos Perl externos.
perl_eval_pv me permite ejecutar una única instrucción Perl y devolver la variable resultante en C. El siguiente programa string.c ejecuta tres declaraciones Perl y obtiene un int de la primera declaración, un float de la segunda declaración y un char * de la tercera declaración.
#include
Si compila y ejecuta string.c, verá que SvIV(. ) lo crea un número entero, SvNV() crea un flotante y SvPV() crea una cadena:
a = 9 a = 9 a = Just Another Perl Hacker
In In. En el ejemplo anterior, creamos una variable global para guardar el resultado de la ejecución de la expresión.
En muchos casos, es una buena práctica devolver el valor de retorno de la ejecución de perl_eval_pv(). Por ejemplo:
... STRLEN n_a; SV *val = perl_eval_pv("reverse 'rekcaH lreP rehtonA tsuJ'", printf("%s\n", SvPV(val,n_a) ) ;...
Este enfoque elimina la necesidad de crear variables globales y simplifica el código químico, evitando así la contaminación del espacio de nombres.