我有一个具有许多功能的文件,如下所示,其中包含参数。我想打印该函数的起始'{'到结束'}'的行号。所以其他所有功能都是如此。
我尝试了什么:
#!/usr/bin/perl
format EMPLOYEE =
@<<<<<<<<<<<<<<<<<<<<<<<<<<<< @#### @####
$func $start $end
=======================================================
.
format EMPLOYEE_TOP =
=======================================================
Function Start End
=======================================================
.
select(STDOUT);
$~ = EMPLOYEE;
$^ = EMPLOYEE_TOP;
open(FILE, "<input.txt" );
while(<FILE>){
if(/^static/){
chomp;
$cols = (split(/ /))[2];
$func=$cols;
}
}
close FILE;
open(FILE, "<input.txt" );
$line;
$count = 0;
@key1=qw(static);
@key2=qw(return\sfailed);
while($line = <FILE> )
{
$count++;
foreach $k (@key1)
{
if ( $line =~ m/$k/ )
{
$start=$count;
last;
}
}
foreach $k (@key2)
{
$r=0;
if ( $line =~ m/$k/ )
{
last;
}
$end=$r+$count;
}
}
close FILE;
write;
文件中的示例代码:
1.static int function1 (...,...,...,some arguments,..,..)
{
statements//
also has loops//
statements//
234. }
235.static int function2 (...,...,...,some arguments,..,..)
{
statements//
also has loops//
statements//
339.
}
输出应为:
1 and 234 for function1.
235 and 339 for funciton2.
答案 0 :(得分:0)
{ {} {} }
嵌套:需要递归这充其量是棘手的,但我会给你一些尝试。
功能分隔符
首先我们需要知道函数是如何开始的。我们可以采取什么作为分隔符?例如,函数定义之前是static int
吗?是否保证static int
的每个实例都位于定义之前?
最有可能的是,你会有几个分隔符。我们将从一个开始,然后将它们添加到列表中。
递归正则表达式
假设static int
是一个正确的分隔符,而且唯一的分隔符 - 我们知道这可能不是这种情况,但我们可以在以后的正则表达式中添加分隔符 - 我们可以使用递归正则表达式来处理嵌套的大括号:< / p>
static int [^{]*\K({(?:[^{}]++|(?1))*})
Perl One-Liner
也许不是最优化的代码,但这让您有机会尝试这种模式:
perl -0777 -ne 'while(m/static int [^{]*\K({(?:[^{}]++|(?1))*})/g){print "$&\n";}' yourfile
尝试一下,然后让我们看看我们是否能够进行调整。