sub mask_it { my ($instr) = @_; my $retstr = ''; while ($instr =~ /[0-9a-z]/i) { if (/^([^0-9a-z]*)([a-z]+)/i) { $retstr .= $1; #pass non-alphas as-is my $orig = $2; #replace alphas with new ones $retstr .= join('',map { chr(65+int(rand(26))) } split(//,$orig)); } elsif (/^([^0-9a-z]*)(\d+)/i { $retstr .= $1; #pass non-digits as-is my $orig = $2; #replace digits with new ones $retstr .= join('',map { chr(48+int(rand(10))) } split(//,$orig)); } $instr =~ s/^(\W*)$orig//; #remove from input } $retstr .= $instr; #pass on anything that's left over return $retstr; }