if (my @matches = $input_string =~ /$metadata[$_]{"pattern"}/g) {
print $-[1] . "\n"; # this gives me error uninitialized ...
}
print scalar @matches;
给了我4,没关系,但如果我使用$-[1]
来开始第一场比赛,那就会给我带来错误。哪里有问题?
EDIT1:我如何在字符串中获得每场比赛的位置? 如果我有字符串“ahoj ahoj ahoj”和regexp / ahoj / g,我怎么能在字符串中获得每个“ahoj”的开头和结尾的位置?
答案 0 :(得分:8)
数组@-
包含上一次成功匹配开始的偏移(在$-[0]
中),并且该匹配中可能存在的任何捕获的偏移量(在$-[1]
中, $-[2]
等。)。
您的字符串中没有捕获,因此只有$-[0]
有效,并且(在您的情况下)最后一次成功匹配是第四次,因此它将包含模式的第四个实例的偏移量。
获得个别比赛抵消的方法是写
my @matches;
while ("ahoj ahoj ahoj" =~ /(ahoj)/g) {
push @matches, $1;
print $-[0], "\n";
}
<强>输出强>
0
5
10
或者,如果您不想要单个匹配的字符串,那么
my @matches;
push @matches, $-[0] while "ahoj ahoj ahoj" =~ /ahoj/g;