Regex 打印函数定义大小及其名称的步骤

Regex 打印函数定义大小及其名称的步骤,regex,perl,Regex,Perl,我想打印所有函数定义的大小 示例文件(实际文件相当大) 我已经使用doxygen将函数名(还有更多)提取到一个文本文件中 function.txt ChainCtrlBuildChain ChainCtrlInit 我的代码 use strict; use warnings; open(FILE, "< chaincontroller.c") or die $!; my @lines = <FILE>; open(FILE1, "< functions.txt") o

我想打印所有函数定义的大小

示例文件(实际文件相当大)

我已经使用doxygen将函数名(还有更多)提取到一个文本文件中

function.txt

ChainCtrlBuildChain
ChainCtrlInit 
我的代码

use strict;
use warnings;
open(FILE, "< chaincontroller.c") or die $!;
my @lines = <FILE>;
open(FILE1, "< functions.txt") or die $!;
my @lines1 = <FILE1>;

foreach my $func (@lines1){
foreach my $src_line (@lines){
    if ($src_line =~ /$func\([^;]+$/){        # points to function definitions
             #need to extract function body into an array and get its size

 }
}

如果有任何其他方法,将非常感谢您对此问题的帮助。

这可能会在许多方面失败,具体取决于您的代码格式,但您可以尝试使用触发器,触发器在函数定义中被激活,在右大括号中被禁用。您可以在激活时计算行数并减去三行

foreach my $func (@lines1){
    chomp $func;
    foreach my $src_line (@lines){
        if (my $flipflop = ($src_line =~ /$func\([^;]+$/ .. $src_line =~ /^}/)){
            ++$lines;
            if ($flipflop =~ /E0$/) {
                printf qq|function %s has %d lines\n|, $func, $lines - 3;
                $lines = 0;
            }   
            next;
        }   

     }   
}
在我的测试中,它产生:

function ChainCtrlBuildChain has 3 lines
function ChainCtrlInit has 2 lines

这可能在许多方面失败,这取决于您的代码格式,但您可以尝试使用触发器,它在函数定义中被激活,在右大括号中被禁用。您可以在激活时计算行数并减去三行

foreach my $func (@lines1){
    chomp $func;
    foreach my $src_line (@lines){
        if (my $flipflop = ($src_line =~ /$func\([^;]+$/ .. $src_line =~ /^}/)){
            ++$lines;
            if ($flipflop =~ /E0$/) {
                printf qq|function %s has %d lines\n|, $func, $lines - 3;
                $lines = 0;
            }   
            next;
        }   

     }   
}
在我的测试中,它产生:

function ChainCtrlBuildChain has 3 lines
function ChainCtrlInit has 2 lines

这可能在许多方面失败,这取决于您的代码格式,但您可以尝试使用触发器,它在函数定义中被激活,在右大括号中被禁用。您可以在激活时计算行数并减去三行

foreach my $func (@lines1){
    chomp $func;
    foreach my $src_line (@lines){
        if (my $flipflop = ($src_line =~ /$func\([^;]+$/ .. $src_line =~ /^}/)){
            ++$lines;
            if ($flipflop =~ /E0$/) {
                printf qq|function %s has %d lines\n|, $func, $lines - 3;
                $lines = 0;
            }   
            next;
        }   

     }   
}
在我的测试中,它产生:

function ChainCtrlBuildChain has 3 lines
function ChainCtrlInit has 2 lines

这可能在许多方面失败,这取决于您的代码格式,但您可以尝试使用触发器,它在函数定义中被激活,在右大括号中被禁用。您可以在激活时计算行数并减去三行

foreach my $func (@lines1){
    chomp $func;
    foreach my $src_line (@lines){
        if (my $flipflop = ($src_line =~ /$func\([^;]+$/ .. $src_line =~ /^}/)){
            ++$lines;
            if ($flipflop =~ /E0$/) {
                printf qq|function %s has %d lines\n|, $func, $lines - 3;
                $lines = 0;
            }   
            next;
        }   

     }   
}
在我的测试中,它产生:

function ChainCtrlBuildChain has 3 lines
function ChainCtrlInit has 2 lines
使用严格;
使用警告;
打开(文件“
严格使用;
使用警告;
打开(文件“
严格使用;
使用警告;
打开(文件“
严格使用;
使用警告;
打开(文件“
@Ad vic:这是因为触发器从函数定义开始,以右大括号结束,但函数名和大括号都不算作函数体的行。好的。但是你没有初始化$line。我认为它应该在foreach循环之前初始化为0。你也不能遍历整个samp通过启动上次离开的内部循环来删除文件。例如,使用一个简单的计数器,在调用下一步时设置为当前行号;并作为内部循环的开始。这当然是假设函数名在两个文件中的顺序相同。否。它们的顺序不同。doxygen提取的函数名以升序排列,不像在代码中是随机的。这就是为什么完全迭代。@Ad vic:这是因为触发器从函数定义开始,以closin结束