Estoy escribiendo un módulo perl llamado perl5i. Su objetivo es arreglar una serie de problemas comunes de Perl en un módulo (usando muchos otros módulos).Escribiendo un contenedor de línea de comando portátil en C
para alegar ésta en la línea de comandos para los trazadores de líneas uno Usted escribiría: perl -Mperl5i -e 'say "Hello"'
Creo que es demasiado prolijos así que me gustaría para suministrar una envoltura perl5i para que pueda escribir perl5i -e 'say "Hello"'
. También me gustaría que las personas puedan escribir scripts con #!/usr/bin/perl5i
, por lo que debe ser un programa C compilado.
Pensé que todo lo que tenía que hacer era presionar "-Mperl5i" en la parte delantera de la lista de argumentos y llamar a Perl. Y eso es lo que intenté.
#include <unistd.h>
#include <stdlib.h>
/*
* Meant to mimic the shell command
* exec perl -Mperl5i "[email protected]"
*
* This is a C program so it works in a #! line.
*/
int main (int argc, char* argv[]) {
int i;
/* This value is set by a program which generates this C file */
const char* perl_cmd = "/usr/local/perl/5.10.0/bin/perl";
char* perl_args[argc+1];
perl_args[0] = argv[0];
perl_args[1] = "-Mperl5i";
for(i = 1; i <= argc; i++) {
perl_args[i+1] = argv[i];
}
return execv(perl_cmd, perl_args);
}
Windows complica este enfoque. Aparentemente, los programas en Windows no pasan una matriz de argumentos, se pasan todos los argumentos como una sola cadena y luego hacen su propio análisis. Por lo tanto, algo así como perl5i -e "say 'Hello'"
se convierte en perl -Mperl5i -e say 'Hello'
y Windows no puede ocuparse de la falta de cotización.
Entonces, ¿cómo puedo manejar esto? Ajustar todo entre comillas y escapes en Windows? ¿Hay una biblioteca para manejar esto por mí? ¿Hay un mejor enfoque? ¿Podría simplemente no generar un programa C en Windows y escribirlo como un contenedor perl ya que no es compatible con #! ¿de todas formas?
ACTUALIZACIÓN: Sea más claro, este software se envía por lo que las soluciones que requieren el uso de un cierto shell o ajustar la configuración del shell (por ejemplo, alias perl5i='perl -Mperl5i'
) no son satisfactorias.
Lo sentimos, solo BOG estándar ANSI C 89. No sé qué compilador que podrían tener disponible (si existe). – Schwern