$S = 'opppppppp'; # (S -> Sp) x 8 while ($S =~ /p/) { @processing = ($S); $S =~ s/op/i/; # op -> i push @process, $S; $S =~ s/ip/c/; # ip -> c push @processing, $S; while ($S =~ /c/) { $S =~ s/oc/io/; # oc -> io $S =~ s/ic/co/; # ic -> co $S =~ s/^c/io/; # cS -> ioS push @processing, $S; } @out = map { sprintf ("%9s", $_) } @processing; print join (" ->", @out), "\n"; }