使用regex和perl查找函数调用

时间:2014-10-22 07:38:16

标签: regex perl

我想使用perl和regex在源文件中找到函数的所有调用。

函数调用看起来像(简化),如:

gettrans(ABC,DEF,GHI);

第二个和第三个参数是可选的。所以gettrans(ABC)和gettrans(ABC,DEF)也是有效的。但该函数必须至少具有第一个参数。

我使用以下测试文件检查我的perl代码:

gettrans(ABC);
gettrans(ABC,D);
gettrans(ABC,D,E);
gettrans(A,B,C);        gettrans(D);
gettrans(ABC,);
gettrans(,A);

我目前的perl代码如下所示:

#!/usr/bin/perl -w
my $i = 1;
while ( my $line = <> ) {
    my @res = ( $line =~ /gettrans\((\w+)(,\w+){0,2}\)/g );

    print "line " . $i . ":\n";
    foreach (@res) {
        if ( defined($_) ) {
            print $_ . "\n";
        }
    }
    print "\n";
    $i++;
}

这给出了以下输出:

line 1:
ABC

line 2:
ABC
,D

line 3:
ABC
,E

line 4:
A
,C
D

line 5:

line 6:

然而,我所期望的输出或更好,我想要的是:

line 1:
gettrans(ABC)

line 2:
gettrans(ABC,D)

line 3:
gettrans(ABC,D,E)

line 4:
gettrans(A,B,C)
gettrans(D)

line 5:

line 6:

此外,对我来说同样令人困惑的是,如果我将测试文件和正则表达式中的逗号替换为0(零),我会得到一个完全不同的输出,这更接近我想要的(除了事实,在这种情况下,我也得到第5行和第6行的输出[这是无效的函数调用]。

将逗号替换为0(零)的输出:

line 1:
ABC

line 2:
ABC0D

line 3:
ABC0D0E

line 4:
A0B0C
D

line 5:
ABC0

line 6:
0A

我刚刚开始学习珍珠和正则表达。很高兴得到关于我目前的误解的任何暗示。

谢谢大家!

铜, 彼得

2 个答案:

答案 0 :(得分:1)

将整个正则表达式包装在paranthesis中

(gettrans\(\w+(,\w){0,2}\);)

将匹配函数调用

while (my $line = <>) {
        $line =~ /(gettrans\(\w+(,\w){0,2}\);)/g
        print $1 . "\n"

}

将产生输出

gettrans(ABC);
gettrans(ABC,D);
gettrans(ABC,D,E);
gettrans(A,B,C);        gettrans(D);

此处$line =~ /(gettrans\(\w+(,\w){0,2}\);)/g检查$line中的模式,并且paranthesis ()中的匹配字符串保存在$1变量中,该变量已打印。

#!/usr/bin/perl -w
my $i = 1;
while (my $line = <>) {
        $line =~ /(gettrans\((\w+)(,\w+){0,2}\))/g;

        print "line " . $i . ":\n";

        print $1."\n";
        $i++;
}

将产生输出

line 1:
gettrans(ABC)

line 2:
gettrans(ABC,D)

line 3:
gettrans(ABC,D,E)

line 4:
gettrans(A,B,C)
gettrans(D)

line 5:

line 6:

答案 1 :(得分:0)

以下是我如何构建正则表达式。

注意,行号变量$.可以显示上次读取的文件句柄的当前行号:

use strict;
use warnings;

while (<DATA>) {
    if ( my @results = /gettrans\(\w+(?:,\w+){0,2}\)/g ) {
        print "line $.:\n";
        print "$_\n" for @results;
        print "\n";
    }
}

__DATA__
gettrans(ABC);
gettrans(ABC,D);
gettrans(ABC,D,E);
gettrans(A,B,C);        gettrans(D);
gettrans(ABC,);
gettrans(,A);

输出:

line 1:
gettrans(ABC)

line 2:
gettrans(ABC,D)

line 3:
gettrans(ABC,D,E)

line 4:
gettrans(A,B,C)
gettrans(D)