2014-04-06 32 views
7

Bir süredir C programlama yapıyorum. Şimdi perl'in arayabileceği bir C programı yazmam gerek. Aşağıdaki dummy perl işleviyle aynı sözdizimine sahip olmalıdır: İki giriş alın, her ikisi de dizgidir (ikili karakterler içerebilir, hatta "\ x00"), yeni bir dize çıktı. dışındaki çıkışına/I C işlevi nasıl yazılır ve perl'den nasıl yazılır

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

C

bunu yapmak gerekir kısaca uygulanması için yudum baktı, ama girdi alarak neden Tabii

, fonksiyonun algoritma işte, daha karmaşık olacak Bir tamsayı kolay değildir, umarım birisi somut bir örnek verebilir.

Şimdiden teşekkürler.

UPDATE: Rob'den (cpan'da Inline :: C modülünün yazarı) harika bir örneği var, teşekkürler!

############################## 
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); 

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

cevap

11

Perl, bu tür bir şey için XS adlı bir tutkal diline sahiptir. Perl veri tipleri ve C türleri arasındaki eşleştirmeleri bilir. Örneğin, bir C işlevi

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

ilgili tüm aracı inşa zincirleri XS destek var, XS kodu

MODULE = Foo PACKAGE = Foo 

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

Foo.xs dosya modülü takıldığında derlenmiş olacak tarafından sarılmış olabilir. Perl belgelerde bir XS tutorial vardır

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

: işlev Foo::dummy("foo", "bar") olarak Perl çağrılabilir şekilde XS kodu Perl yüklendikten sonra

değişken dönüşüm kodu, otomatik olarak oluşturulur ve referans belgeleri perlxs.

XS, modüller için iyi bir seçimdir, ancak tek seferlik komut dosyaları için gariptir. Inline::C modülü, tutkal C kodunu doğrudan Perl betiğinize gömmenize izin verir ve C kodu her değiştiğinde otomatik derlemeyi gerçekleştirir. Ancak, bu yaklaşımla daha az kod otomatik olarak oluşturulabilir.

+0

Hızlı yanıt ve bağlantı için teşekkürler. Inline :: C'nin perl guts'u bilmeyen biri için perleks kullanmanın acısını azalttığı anlaşılıyor. Inline :: C: https://metacpan.org/pod/Inline::C-Cookbook'u kullanmanın birçok örneğini içeren bir yemek kitabı var. – packetie