2012-03-01 109 views
0

我需要創建一個函數指針文件。我正在使用perl。 我的輸入是函數聲明的列表。下面是一些例子:函數聲明使用perl函數指針聲明

1.

char * cc_Hightor_ind(Closed* p_Closed); 
    to 
char * (*cc_Hightor_ind)(Closed* p_Closed); 

2.

char cc_Hightor_ind(Closed* p_Closed); 
    to 
char (*cc_Hightor_ind)(Closed* p_Closed); 

這些是2通常情況下,該函數返回一個指針和值。 我不能解決如何將函數名稱轉換爲在前面加(*。

我的邏輯是在尋找「_ind」,我回軌道字的開頭並添加(*。 我我發現很難該翻譯成代碼。 請提出相同的。目前我使用的正則表達式的每個數據類型和添加添加(*它這是一個非常漫長的過程。

在此先感謝

回答

1

根據更新的問題更新:

while(<DATA>) { 
    chomp; 
    s/(\*?\s+)(\w+\s*\()/$1(*$2)/; 
    say; 
} 
__DATA__ 
char * cc_Hightor_ind(Closed* p_Closed); 
char cc_Hightor_ind(Closed* p_Closed); 

輸出:

char * (*cc_Hightor_ind)(Closed* p_Closed); 
char (*cc_Hightor_ind)(Closed* p_Closed); 
+0

感謝,但我不知道這是否會工作,如果我的$海峽=「字符cc_Hightor_ind(閉* p_Closed);」!; – Aadishri 2012-03-01 13:40:32

+1

@Aad:當然,它不會起作用,但是你想在這種情況下做什麼?請添加更多的測試用例(通過編輯你的問題)來滿足你的需求 – Toto 2012-03-01 13:49:09

+0

@Aad:查看我更新的答案。 – Toto 2012-03-02 09:16:51

2

阿金處理XML正則表達式,這將永遠是100%正確的,除非你涉及到一個適當的C解析器。但是你可以寫出一些對大多數常見情況都是正確的,並且對於給定的C代碼樣本可能總是正確的 - 特別是如果該代碼是自動生成的。

試試這個初始嘗試,其中包括您發佈的兩個代碼示例。如果您希望我們幫助您更那麼請張貼的一個完整的例子你正在處理

use strict; 
use warnings; 

while (<DATA>) { 
    chomp; 
    (my $ptr = $_) =~ s/(\w+ \s*)\(/(*$1)(/x ; 
    print $ptr, "\n"; 
} 

__DATA__ 
char * cc_Hightor_ind(Closed* p_Closed); 
char cc_Hightor_ind(Closed* p_Closed); 

輸出

char * (*cc_Hightor_ind)(Closed* p_Closed); 
char (*cc_Hightor_ind)(Closed* p_Closed); 
0

我在下面迂迴的解決方案已經抵達:-(

my $line = "char * cc_Hightor_ind(Closed* p_Closed);"; 
# split with white-space as delimiter 
my @splt = split (/\s/, $line); 
$count = split(/\s/, $line); 
#traverse through tokens 
for ($i = 0; $i < $count; $i++) { 
    # If token has '_ind', then prepend '(*' and append ')' to it 
    if ((@splt[$i] =~ s/_ind/_ind\)/)) { 

    @splt[$i] = "\(* @splt[$i]\) "; 

    } 
} 

    $line = join (" ", @splt); 
    print "$line\n"; 

#sample output 
#D:\gsa\mytries\prl>getFptr.pl 
#char * (* cc_Hightor_ind(Closed* p_Closed);