Das Verhalten deines ersten Ausdruckes ist auf den ersten Blick komisch, aber gar nicht unlogisch, wenn man es sich mal systematisch überlegt:
* Das c-Flag komplementiert die Liste der zu ersetzenden Zeichen, weshalb also alles von Zeichen 0 bis ord(' ')-1, von ord(' ')+1 bis ord('0')-1 und von ord('9')+1 bis 255 ersetzt wird.
* Ersatz wird in der Liste der Ersatzzeichen nur für die Zeichen 0 bis 10 angegeben, die alle nicht im Eingabestring vorkommen.
* Das d-Flag weist Perl an alle Zeichen der Eingabeliste aus dem Eingabestring zu löschen, wenn für sie kein Ersatz in der Liste der Ersatzzeichen vorliegt, also in diesem Falle alles von Zeichen 11 bis ord(' ')-1, von ord(' ')+1 bis ord('0')-1 und von ord('9')+1 bis 255.
* Insgesamt läuft der Ausdruck in unserem Fall damit auf die folgende Anweisung hinaus: Lösche aus dem Eingabestring alle Zeichen, die nicht ' ', '0', '1', ... oder '9' sind.
(edit: emoticons deaktiviert)\n\n
<!--EDIT|murphy|1129038443-->
When C++ is your hammer, every problem looks like your thumb.