2014-04-11 13 views
7

Tôi cần phải gọi một thói quen perl trong chương trình C của tôi. Các thói quen perl có các đối số sau đây: $a, $b, $c, trong đó $a$b là số nguyên, $c là một chuỗi (có thể chứa các ký tự nhị phân). Theo số perlcall, đây là phương tiện thực hiện cuộc gọi.Gọi một thói quen perl với các thông số

I32 call_sv(SV* sv, I32 flags); 
I32 call_pv(char *subname, I32 flags); 
I32 call_method(char *methname, I32 flags); 
I32 call_argv(char *subname, I32 flags, char **argv); 

Có vẻ rằng tôi chỉ có thể sử dụng call_argv (...), nhưng có hai câu hỏi

  • làm thế nào để tôi vượt qua một số nguyên với perl thói quen
  • làm thế nào để vượt qua một (nhị phân) chuỗi để perl?

Wish có một chức năng như

I32 call_argv(char *subname, I32 flags, int numOfArgs, SV* a, SV* b, SV *c ...); 
+0

perlcall có phần có gắn nhãn "Tham số truyền" vì một lý do. Bạn làm điều đó bằng cách đặt các mục vào ngăn xếp Perl. – hobbs

Trả lời

8

Xem Passing Parameters section of perlcall. Các đối số được đẩy lên ngăn xếp Perl. call_argv không hữu ích khi truyền bất kỳ thứ gì ngoài chuỗi. Quy ước gọi sẽ giống như

PUSHMARK(SP); 
mPUSHi(some_integer); 
mPUSHp(binary_data, len); 
XPUSHs(some_SV_I_had_laying_around); 
PUTBACK; 
call_pv("sub_name", G_DISCARD); 

hoặc bạn có thể sử dụng call_sv nếu bạn có subname trong một SV*, hoặc call_method gọi một phương thức theo tên trên một số đối tượng.

Nếu phụ trả về giá trị hoặc giá trị thì bạn có thể gọi nó bằng G_SCALAR hoặc G_ARRAY và sử dụng macro POP để truy cập giá trị trả lại; điều này được trình bày chi tiết trong hai phần sau. Đừng quên SPAGAIN.

+0

cảm ơn đề xuất! Ví dụ trong phần "Tham số chuyển" là chính xác những gì tôi đang tìm kiếm. Nên đọc toàn bộ hướng dẫn trước khi hỏi :-( – packetie

+0

Một chút gọn gàng của mã đó là sử dụng gia đình 'mPUSH *' thay vào đó, vì chúng làm chết SV mà chúng đẩy. Cũng có một vài cái cụ thể, như 'mPUSHi' cho IV và 'mPUSHp' cho PV. – LeoNerd

+0

@LeoNerd tiếp tục và chỉnh sửa nếu bạn thích :) – hobbs

Các vấn đề liên quan