2

我正在读取字符串中的完整文件,然后进行正则表达式匹配,如下所示:

if($str =~ m/$regex/gc) {
     $offset = $+[0];
}

使用此代码,我可以捕获最后一次成功匹配结束的位置。

现在这会将位置作为字符编号。

有什么办法可以让我偏移为行号?

我现在正在做的是计算从开始$str到结束的换行符的数量$offset

我想知道是否有直接的方法来捕获正则表达式匹配的行号。

4

2 回答 2

4

与人们想象的相反,Nahuel 的使用建议$.在这种情况下实际上是可行的。

这是因为人们可以像使用 Perl 的文件一样读取字符串:

use strict;
use warnings;

my $str = <<EOS;
spam
spam
spam
match
spam
match
EOS

open my $handle, '<', \$str or die $!;

while ( <$handle> ) {

    print $., "\n" if /match/;
}

输出

4
6
于 2012-07-10T10:51:46.123 回答
1

参见 perldoc perlvar,特殊变量$.

编辑:评论后,抱歉我读得太快了

如果有很多匹配项,另一种解决方案可能是创建一个包含新行偏移量的数组:$a[0]-> 第 2 行的偏移量等,然后近似行号,最后增加或减少以找到线。如果最后一行不包含换行符,可能会出现问题。

# create an array with offset of new lines
@a=(0,0);push@a,$-[0]while$str=~/\n/gc;

if($str =~ m/$regex/gc) {
  $offset = $+[0]; 
  # get an approximation of line
  $l=int$offset*@a/$a[-1];
  # increment or decrement
  $l++while$a[$l+1]<$offset;
  $l--while$a[$l]>$offset;
}

编辑:未经测试,更改初始化 @a=(0,0) 以避免最后 +2 并且如果在第一行 $l++while$a[$l+1]$offset 和 *@a 上匹配则安全

于 2012-07-10T10:25:13.207 回答