Nice work. I was reviewing it and I honestly don't remember why I did that (it's been a while since I originally wrote it). The only thing I can think is that I might have been concerned about overwriting the digit. I did have a quit (q) command in there when it was longer, though that is just a shot in the dark. With your suggestion implemented, it does seem to work fine:
sub q{$;=1;for(0..3){$;[$_]=int(rand(9))}}sub _{print@_}&q;for(;;){$:=
+$~=0
;_"$/$; ";$_=<>;if(/^\d{4}$/){@q=split//;--$#q;$@=-1;for(@q){($_==$;[+
++$@]
)&&++$:||(grep/$_/,@;)&&++$~}_"$~W$:B ";++$;;$:==4|$;>10&&_(@;)&&&q}}