2014-04-06 12 views
7

Tôi đã lập trình C trong một thời gian. Bây giờ tôi cần phải viết một chương trình C mà perl có thể gọi. Cần có cú pháp giống như hàm perl giả sau: Lấy hai đầu vào, cả hai đều là chuỗi (có thể chứa ký tự nhị phân, thậm chí là "\ x00"), xuất ra một chuỗi mới.cách viết hàm C và có thể gọi nó từ perl

Tất nhiên, thuật toán của hàm sẽ phức tạp hơn, đó là lý do tại sao tôi cần phải làm điều đó trong C.

sub dummy { 
    my ($a, $b) = @_; 
    return $a . $b; 
} 

Tôi có thời gian ngắn nhìn SWIG để thực hiện, nhưng lấy đầu vào/ouput khác hơn một số nguyên không phải là dễ dàng, hy vọng ai đó có thể đưa ra một ví dụ cụ thể.

Xin cảm ơn trước.

CẬP NHẬT: Có ví dụ tuyệt vời từ Rob (tác giả của mô-đun Inline :: C trong cpan), cảm ơn!

############################## 
use warnings; 
use strict; 
use Devel::Peek; 

use Inline C => Config => 
BUILD_NOISY => 1, 
; 

use Inline C => <<'EOC'; 

SV * foo(SV * in) { 
SV * ret; 

STRLEN len; 
char *tmp = SvPV(in, len); 
ret = newSVpv(tmp, len); 
sv_catpvn(ret, tmp, len); 
return ret; 

} 

EOC 

my $in = 'hello' . "\x00" . 'world'; 
my $ret = foo($in); 


Dump($in); 
print "\n"; 
Dump ($ret); 

############################## 

Trả lời

11

Perl có ngôn ngữ keo gọi là XS cho loại điều này. Nó biết về ánh xạ giữa các kiểu dữ liệu Perl và kiểu C. Ví dụ, một hàm C

char *dummy(char *a, int len_a, char *b, int len_b); 

có thể được bao bọc bởi các mã XS

MODULE = Foo PACKAGE = Foo 

char * 
dummy(char *a, int length(a), char *b, int length(b)); 

File Foo.xs sẽ được biên dịch khi module được cài đặt, tất cả các chuỗi công cụ xây dựng có liên quan có hỗ trợ cho XS. mã chuyển đổi

Đối số sẽ được tạo tự động, do đó chức năng có thể được gọi trong Perl như Foo::dummy("foo", "bar"), một lần mã XS đã được tải từ Perl:

package Foo; 
use parent 'DynaLoader'; 
Foo->bootstrap; 

Có một XS tutorial trong tài liệu perl, và tài liệu tham khảo trong perlxs.

XS là lựa chọn tốt cho các mô-đun, nhưng rất khó xử đối với các tập lệnh một lần. Mô-đun Inline::C cho phép bạn nhúng mã C keo trực tiếp vào tập lệnh Perl của bạn và sẽ xử lý việc biên dịch tự động bất cứ khi nào mã C thay đổi. Tuy nhiên, ít mã hơn có thể được tạo tự động với phương pháp này.

+0

Cảm ơn bạn đã trả lời và liên kết nhanh. Có vẻ như Inline :: C đã làm giảm sự đau đớn khi sử dụng perlxs cho một người không biết perl ruột. Có một cuốn sách dạy nấu ăn với nhiều ví dụ về cách sử dụng Inline :: C: https://metacpan.org/pod/Inline::C-Cookbook. – packetie

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