我想使用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
我刚刚开始学习珍珠和正则表达。很高兴得到关于我目前的误解的任何暗示。
谢谢大家!
铜, 彼得
答案 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)