我正在读取字符串中的完整文件,然后进行正则表达式匹配,如下所示:
if($str =~ m/$regex/gc) {
$offset = $+[0];
}
使用此代码,我可以捕获最后一次成功匹配结束的位置。
现在这会将位置作为字符编号。
有什么办法可以让我偏移为行号?
我现在正在做的是计算从开始$str
到结束的换行符的数量$offset
。
我想知道是否有直接的方法来捕获正则表达式匹配的行号。
参见 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 上匹配则安全