2010-10-05 34 views
5

我希望在Perl中嵌入C代碼。在這個C代碼中,我想將一個巨大的文件讀入內存,進行一些更改並構建一個哈希(自定義)。我希望從我的Perl代碼中訪問這個哈希。可能嗎?我怎樣才能達到目標?如何在C代碼中構建Perl哈希?

回答

3

又讀Why should I use Inline to do it?

+0

哦,請停止建議Inline作爲事實上的標準解決方案。這是部署的噩夢。除非特別要求「我需要在我的機器和我的機器上執行此操作」,否則Inline會轉而解決問題。 – tsee 2010-10-05 13:00:54

+0

當我必須的時候我會寫XS代碼,但是當我不需要時,Inline :: C很棒。 – mob 2010-10-05 14:56:55

1

您可以使用SWIG C,Perl和其他幾種語言之間的接口。

11

對於在perl中嵌入c,您正在尋找XS。關於這方面的大量文檔可以在perlxsperlxstut中找到。至於從C構建perl數據結構,您將不得不使用perlapi中處理散列的部分。關於XS的許多文檔已經解釋了各種各樣的內容。您正在尋找的重要部分是newHVhv_store

這裏是類似於你可能想要做什麼東西微小的(和完全未經測試)例如:

SV * 
some_func() 
    PREINIT: 
     HV *hash; 
    CODE: 
     hash = newHV(); 
     hv_stores(hash, "foo", 3, newSViv(42)); 
     hv_stores(hash, "bar", 3, newSViv(23)); 
     RETVAL = newRV_noinc((SV *)hash); 
    OUTPUT: 
     RETVAL 

這就是所謂的some_func一個XS子程序,這將建立一個哈希值,並返回對它的引用到perl空間:

my $href = some_func(); 
# $href = { foo => 42, bar => 23 };