Perl - 正则表达式匹配的字符串

Kra*_*rab 2 regex perl

if (my @matches = $input_string =~ /$metadata[$_]{"pattern"}/g) {
  print $-[1] . "\n"; # this gives me error uninitialized ...
}
Run Code Online (Sandbox Code Playgroud)

print scalar @matches;给我4,这没关系,但是如果我$-[1]用来开始第一场比赛,它就会给我带来错误.哪里有问题?

EDIT1:我如何在字符串中获得每场比赛的位置?如果我有字符串"ahoj ahoj ahoj"和regexp/ahoj/g,我怎么能在字符串中获得每个"ahoj"的开头和结尾的位置?

Bor*_*din 8

该阵列@-包含最后成功匹配的(在开始的偏移量$-[0])和任何捕获有可能已经在那场比赛(在偏移$-[1],$-[2]等).

您的字符串中没有捕获,因此只有$-[0]有效,并且(在您的情况下)最后一次成功匹配是第四次,因此它将包含模式的第四个实例的偏移量.

获得个别比赛抵消的方法是写

my @matches;
while ("ahoj ahoj ahoj" =~ /(ahoj)/g) {
  push @matches, $1;
  print $-[0], "\n";
}
Run Code Online (Sandbox Code Playgroud)

产量

0
5
10
Run Code Online (Sandbox Code Playgroud)

或者如果你不想要个别匹配的字符串,那么

my @matches;
push @matches, $-[0] while "ahoj ahoj ahoj" =~ /ahoj/g;
Run Code Online (Sandbox Code Playgroud)