【发布时间】:2026-01-07 08:30:01
【问题描述】:
我正在编写一个名为 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 -e say 'Hello',Windows 无法处理缺少引用的问题。
那么,我该如何处理呢?在 Windows 上用引号和转义符包裹所有内容?有图书馆可以帮我处理吗?有更好的方法吗?我可以不在 Windows 上生成 C 程序并将其编写为 perl 包装器,因为它不支持 #!还是?
更新:更清楚一点,这是随附的软件,因此需要使用特定外壳或调整外壳配置(例如,alias perl5i='perl -Mperl5i')的解决方案并不令人满意。
【问题讨论】:
标签: c windows perl command-line