use feature 'say';
$str = "DEFxkdmeABCidkDEFledxaoDEFasdDEF";

say "gr\t: ", $str =~ s/((?<=ABC).*?)DEF/\1def/gr;

$tmp = $str;
1 while ($tmp =~ s/((?<=ABC).*?)DEF/\1def/g);
say "while\t: $tmp";

ABCより後ろのDEFをdefにする正規表現なのですが、上記を実行すると
gr   : DEFxkdmeABCidkdefledxaoDEFasdDEF
while : DEFxkdmeABCidkdefledxaodefasddef
となります。何故grの方はgオプションをつけているにも関わらず一度しか置換されないのでしょうか?