3
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”和正则表达式/ahoj/g,我如何获得字符串中每个“ahoj”的开始和结束位置?

4

1 回答 1

9

该数组@-包含最后一次成功匹配的开始偏移量(in $-[0])以及该匹配中可能存在的任何捕获的偏移量(in$-[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;
于 2013-02-22T20:37:37.543 回答