我正在读取字符串中的完整文件,然后进行正则表达式匹配,如下所示:
if($str =~ m/$regex/gc) {
$offset = $+[0];
}
使用此代码,我可以捕获上次成功匹配结束的位置。
现在这将把位置作为字符编号。
有什么方法可以作为行号偏移?
我现在要做的是,我计算从$str
到结束$offset
开头的换行符数。
我想知道有没有直接的方法来捕获正则表达式匹配的行号。
答案 0 :(得分:4)
与人们可能想象的相反,在这种情况下使用Nahuel's suggestion的$.
实际上是可行的。
这是因为人们可以像使用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
答案 1 :(得分:1)
参见perldoc perlvar,特殊变量$.
另一种解决方案,如果有很多匹配,可以创建一个包含新行偏移的数组:$ a [0] - &gt;线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 + 1] $偏移 和* @添加