http://www.perlmonks.org?node_id=970762


in reply to numbers masking

Take the separators out, preserving them and their offset adjusted for their position as it would be in the number without them. Then do the masking and, finally, put them back.

knoppix@Microknoppix:~$ perl -E ' > $num = q{17403 4893 18345-973409}; > say $num; > $sepCt = 0; > push @seps, [ $1, $-[ 0 ] - $sepCt ++ ] while $num =~ m{(\D)}g; > $num =~ s{\D}{}g; > $maskLen = length( $num ) - 10; > substr $num, 6, $maskLen, q{X} x $maskLen; > substr $num, $_->[ 1 ], 0, $_->[ 0 ] for reverse @seps; > say $num;' 17403 4893 18345-973409 17403 4XXX XXXXX-XX3409 knoppix@Microknoppix:~$

I hope this is helpful.

Update: This can be simplified. The adjustment of position and replacement of separators in reverse order is not necessary. Separators can be put back into the string from left to right as, once one has been put back in, the rest of the string has been moved one character to the right so the next position is already correct without adjustment.

knoppix@Microknoppix:~$ perl -E ' $num = q{17403 4893 18345-973409}; say $num; push @seps, [ $1, $-[ 0 ] ] while $num =~ m{(\D)}g; $num =~ s{\D}{}g; $maskLen = length( $num ) - 10; substr $num, 6, $maskLen, q{X} x $maskLen; substr $num, $_->[ 1 ], 0, $_->[ 0 ] for @seps; say $num;' 17403 4893 18345-973409 17403 4XXX XXXXX-XX3409 knoppix@Microknoppix:~$

Breaking this down as requested by Anonymonk.

Update 2: Clarified (I hope) the wording of the first update.

Cheers,

JohnGG

Replies are listed 'Best First'.
Re^2: numbers masking
by Anonymous Monk on May 16, 2012 at 07:39 UTC

    Thnks, but can u plz explain it