我正在编写一个名为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,将.p5iperl -Mperl5i %*关联。当然,这意味着在注册表中进行修改,最好避免使用IMO。最好包含有关如何在文档中手动添加关联的说明。

另一个更新

您可能想看看parl是如何做到的。

09-25 18:50