Я пишу модуль perl под названием perl5i. Его цель - исправить ряд общих проблем Perl в одном модуле (используя множество других модулей).
Чтобы вызвать его в командной строке для одного лайнера, вы должны написать: perl -Mperl5i -e 'say "Hello"'
Я думаю, что это слишком многословно, поэтому я хотел бы предоставить оболочку perl5i, чтобы вы могли написать perl5i -e 'say "Hello"'
. Я также хотел бы, чтобы люди могли писать сценарии с помощью #!/usr/bin/perl5i
, поэтому он должен быть скомпилированной программой C.
Я понял, что все, что мне нужно было сделать, это нажать "-Mperl5i" на передний план списка аргументов и вызвать perl. И это то, что я пробовал.
#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 усложняет этот подход. По-видимому, программы в Windows не передают массив аргументов, они передают все аргументы как одну строку, а затем выполняют собственный анализ. Таким образом, что-то вроде perl5i -e "say 'Hello'"
становится perl -Mperl5i -e say 'Hello'
, и Windows не может справиться с отсутствием цитирования.
Итак, как я могу справиться с этим? Обернуть все в кавычки и ускользнуть в Windows? Есть ли библиотека для обработки этого для меня? Есть ли лучший подход? Могу ли я просто не создавать C-программу в Windows и записывать ее как оболочку perl, поскольку она не поддерживает #! в любом случае?
ОБНОВЛЕНИЕ. Будьте более ясны, это отгруженное программное обеспечение, поэтому решения, требующие использования определенной оболочки или настройки конфигурации оболочки (например, alias perl5i='perl -Mperl5i'
), не являются удовлетворительными.