Tôi đang viết một mô-đun perl có tên là perl5i. Mục đích của nó là để sửa chữa một loạt các vấn đề thường gặp của Perl trong một mô-đun (sử dụng nhiều mô-đun khác).Viết trình bao bọc dòng lệnh di động trong C
Để gọi nó trên dòng lệnh cho một dòng bạn muốn viết: perl -Mperl5i -e 'say "Hello"'
Tôi nghĩ rằng đó là quá dài dòng vì vậy tôi muốn cung cấp một wrapper perl5i để bạn có thể viết perl5i -e 'say "Hello"'
. Tôi cũng muốn mọi người có thể viết kịch bản với #!/usr/bin/perl5i
vì vậy nó phải là một chương trình C biên dịch.
Tôi đã tìm tất cả những gì tôi phải làm là đẩy "-Mperl5i" lên phía trước danh sách đối số và gọi perl. Và đó là những gì tôi đã thử.
#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 làm phức tạp phương pháp này. Rõ ràng các chương trình trong Windows không được thông qua một mảng các đối số, chúng được chuyển tất cả các đối số dưới dạng một chuỗi duy nhất và sau đó thực hiện phân tích cú pháp của riêng chúng! Vì vậy, một cái gì đó như perl5i -e "say 'Hello'"
trở thành perl -Mperl5i -e say 'Hello'
và Windows không thể xử lý việc thiếu trích dẫn.
Vì vậy, làm cách nào tôi có thể xử lý việc này? Gói tất cả mọi thứ trong dấu ngoặc kép và thoát trên Windows? Có thư viện để xử lý điều này cho tôi không? Có cách tiếp cận tốt hơn không? Tôi có thể không chỉ tạo ra một chương trình C trên Windows và viết nó như là một wrapper perl vì nó không hỗ trợ #! dù sao?
CẬP NHẬT: Hãy rõ ràng hơn, đây là phần mềm được vận chuyển để các giải pháp yêu cầu sử dụng một trình bao hoặc tinh chỉnh cấu hình vỏ (ví dụ: alias perl5i='perl -Mperl5i'
) không thỏa đáng.
Xin lỗi, chỉ có tiêu chuẩn ANSI C 89. Tôi không biết trình biên dịch nào họ có thể có sẵn (nếu có). – Schwern