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

print scalar @matches;$-[1]それは問題ありませんが、最初の試合を開始するために使用すると、エラーが発生しました。問題はどこですか?

EDIT1:各試合の位置を文字列で取得するにはどうすればよいですか? 文字列 "ahoj ahoj ahoj" と正規表現 /ahoj/g がある場合、文字列内の各 "ahoj" の開始位置と終了位置を取得するにはどうすればよいですか?

4

1 に答える 1

9

この配列@-には、最後に成功した一致の開始位置のオフセット ( $-[0]) と、その一致で発生した可能性のあるキャプチャのオフセット ($-[1]など$-[2]) が含まれます。

文字列にはキャプチャがないため、のみ$-[0]が有効であり、(あなたの場合) 最後に成功した一致は 4 番目の一致であるため、パターンの 4 番目のインスタンスのオフセットが含まれます。

個々の一致のオフセットを取得する方法は、次のように書くことです

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 に答える