我正在编写一个名为perl5i的perl模块。它的目的是在一个模块(使用许多其他模块)中解决一系列常见的Perl问题。
要在命令行上为您写的一个衬里调用它:perl -Mperl5i -e 'say "Hello"'
我认为这太罗y了,所以我想提供一个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 -e say 'Hello'
,Windows无法处理缺少引号的情况。那么,我该如何处理呢?将所有内容都用引号引起来,然后在Windows上转义?有图书馆为我服务吗?有没有更好的方法?我能否仅在Windows上不生成C程序并将其编写为Perl包装器,因为它不支持#!反正?
更新:更清楚一点,这是随附的软件,因此需要使用特定 shell 或调整 shell 配置(例如
alias perl5i='perl -Mperl5i'
)的解决方案并不令人满意。 最佳答案
对于Windows,请使用批处理文件。
perl5i.bat
@echo off
perl -Mperl5i %*
%*
是减去%0
的所有命令行参数。在Unixy系统上,一个类似的shell脚本就足够了。
更新:
我认为这可以工作,但是我不是shell向导,也没有方便的* nix系统测试。
perl5i
#!bash
perl -Mperl5i $@
再次更新:
H!现在,我正确理解了您的
#!
注释。我的shell脚本将在CLI上运行,但不能在#!
行中使用,因为#!foo
要求foo
是二进制文件。忽略先前的更新。
Windows似乎使一切变得复杂。
我认为最好是使用批处理文件。
您可以use a file association,将
.p5i
与perl -Mperl5i %*
关联。当然,这意味着在注册表中进行修改,最好避免使用IMO。最好包含有关如何在文档中手动添加关联的说明。另一个更新
您可能想看看parl是如何做到的。