正規表現の先読み抑制

例えばこんな文字列

hogestring[% hoge1 %]a[% hoge2 %]hey

から[% %]で囲まれてるものを全て取り出して表示するとする。
最終的に1行で書けました。

map {print "$_\n"} ('hogestring[% hoge1 %]a[% hoge2 %]hey' =~ /(\[\%.+?\%\])/g);

ちょっと読み難いので2行が妥当かな

my $str = 'hogestring[% hoge1 %]a[% hoge2 %]hey';
map {print "$_\n"} ($str =~ /(\[\%.+?\%\])/g);

ポイントは正規表現の部分
"?"で先読みを抑制したらうまくいきました。
"?"をつけないと"[% hoge1 %]a[% hoge2 %]"にマッチしてしまう。

このパターンを書くのにかなりの時間がかかってしまった。まだまだ要修行