sub X{
if(X()){ return; }
if($a == 0){
A; X(); B; X(); C; X(); D; X();
$a = 1;
}elsif($a == 1){
E; X(); F; X(); G; X(); H; X();
$a = 2;
}elsif($a == 2){
・・・・・・・・・・・
}
return;
}

これを実行するとBの直後でsub Xに戻るとA→B→C→D→C→Dと
実行されなかった部分が繰り返されてしまうんですが、
最後の実行されなかったC→Dは繰り返さずに
A→B→C→Dだけまた繰り返すにはどうしたらいいんでしょうか?
returnの数や位置がいけないのかな・・・必ず残った分が実行されてしまうんです。
なにとぞご教授の方よろしくお願いします。