Piszę moduł perl o nazwie perl5i. Jego celem jest ustalenie pokosu wspólnych problemów Perla w jednym module (przy użyciu wielu innych modułów).Pisanie przenośnej linii poleceń w C
Aby wywołać go w linii komend dla jednej linijki, którą napiszesz: perl -Mperl5i -e 'say "Hello"'
Myślę, że to zbyt rozwlekłe, więc chciałbym dostarczyć opakowanie perl5i, abyś mógł napisać perl5i -e 'say "Hello"'
. Chciałbym również, aby ludzie mogli pisać skrypty z #!/usr/bin/perl5i
, więc musi to być skompilowany program C.
Doszedłem do wniosku, że wystarczy nacisnąć "-Mperl5i" na przedniej stronie listy argumentów i wywołać perl. I tego właśnie próbowałem.
#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);
}
System Windows komplikuje to podejście. Wygląda na to, że programy w systemie Windows nie przekazują tablicy argumentów, przekazują wszystkie argumenty jako pojedynczy ciąg, a następnie same przetwarzają! Zatem coś takiego jak perl5i -e "say 'Hello'"
staje się perl -Mperl5i -e say 'Hello'
, a Windows nie może sobie poradzić z brakiem cytowania.
Jak mogę sobie z tym poradzić? Zawij wszystko w cudzysłowy i ucieczki w systemie Windows? Czy istnieje biblioteka do obsługi tego dla mnie? Czy istnieje lepsze podejście? Czy mogę po prostu nie generować programu C w systemie Windows i zapisać go jako opakowanie perl, ponieważ nie obsługuje #! tak czy inaczej?
AKTUALIZACJA: Dokładniej, jest to dostarczane oprogramowanie, więc rozwiązania wymagające użycia określonej powłoki lub zmiany konfiguracji powłoki (na przykład alias perl5i='perl -Mperl5i'
) nie są zadowalające.
Przepraszam, tylko bagno standardowe ANSI C 89. Nie wiem, jaki kompilator mogą mieć dostępne (jeśli są). – Schwern