我正在编写一个名为perl5i的Perl模块。它的目的是使用许多其他模块,在一个模块中解决大量常见的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 "$@"
*
* 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 -esay'Hello'
,而Windows无法处理缺少引号的情况。
那么,我该如何处理呢? 在Windows上将所有内容都用引号和转义符包含起来吗? 有没有库可以为我处理这个问题? 是否有更好的方法? 我能否只在Windows上编写一个perl包装器而不生成C程序,因为它根本不支持#!?
更新:为了更清楚,这是要发货的软件,因此需要使用特定的shell或调整shell配置(例如,alias perl5i ='perl -Mperl5i'
)的解决方案并不令人满意。
perl5i.cmd
而不是perl5i.bat
,除非您需要在 Win9x 计算机上运行它。 - Brad Gilbert