One small point:
In the tr operator, the [ and ] characters have no special meaning. (In a 'normal' regex, they define a character set.) In the expressison (as taken from the OP)
$data =~ tr/[\ -\~\007\012\015\035\036\037]/ /cs;
the [ and ] characters simply represent themselves. This has no effect in this particular case, however, since these characters are also included in the range \ -\~ that includes, IIRC, all printable ASCII characters. (I think a space qualifies as a 'printable' character.)