2013-08-01 41 views
0

我有一個函數名稱「ChainCtrlBuildChain」作爲文件(FILE)中的文本。檢查後僅輸出函數定義

A c file(FILE1) with content 

VideoChainT* ChainCtrlBuildChain(ChainCtrlT* pChainCtrl, char* pChainName, ChainDefT* pDef) 
      { 
      ... 
      { 
ModTrace((ModT*) pChainCtrl, "ChainCtrlBuildChain: ERROR, chain init failure [chain: %4.4s inst: %d] [err: %d]\n", 
         ... 
      } 

我的代碼:

my @Array=<FILE>; 
my @Array1=<FILE1>; 

foreach my $text (@Array1){ 
if (index($text, $Array[0]) !=-1) 
{ 
print "$text \n"; 
} 
} 

給出了這樣的輸出:

VideoChainT* ChainCtrlBuildChain(ChainCtrlT* pChainCtrl, char* pChainName, ChainDefT* pDef) 
ModTrace((ModT*) pChainCtrl, "ChainCtrlBuildChain: ERROR, chain init failure [chain: %4.4s inst: %d] [err: %d]\n", 

我想這個代替:

VideoChainT* ChainCtrlBuildChain(ChainCtrlT* pChainCtrl, char* pChainName, ChainDefT* pDef) 

我必須使它概括爲輸入文件由用戶而不是固定的。

我想

+0

'Perl'not'PERL' – gaussblurinc

+0

只有當它在函數定義的開始時,你纔想匹配字符串?你幾乎不得不寫一個C語言解析器來做到這一點。 – Barmar

+0

也許'etags'和'ctags'可以給你一個靈感。 – choroba

回答

1

如果您在使用函數名加上(足以讓一個函數的定義是內容這應該工作:

#!/usr/bin/perl 

use warnings; 
use strict; 

my $function_file = 'functions.txt'; 
my $src_file = 'src.c'; 

open(my $ff,'<',$function_file) or die "Cant open $function_file: $!\n"; 
open(my $sf,'<',$src_file) or die "Cant open $src_file: $!\n"; 

my @array = <$ff>; 
my @array2 = <$sf>; 

close($ff); 
close($sf); 

foreach my $func (@array){ 
    chomp $func; 
    foreach my $src_line (@array2){ 
     if ($src_line =~ /$func\(/){ 
      print $src_line; 
     } 
    } 
} 

BTW:你可以少痛在你的生命中,如果你使用3-arg打開!

+0

是的。爲什麼沒有出現在我的腦海裏。它肯定會工作,只需要排除構造函數和靜態函數 –

+0

就會記住關於3-arg open。我是perl的新手,你的建議將來肯定會對我有所幫助。 –