2012-03-01 112 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);