#!/usr/bin/env perl use 5.010; use strict; use warnings; my $start_nonmask_nums = 6; my $end_nonmask_nums = 4; while (my $input = <>) { chomp $input; my $start_mask_pos = get_mask_pos($input, $start_nonmask_nums); my $start_string = substr $input, 0, $start_mask_pos; my $end_mask_pos = get_mask_pos(scalar reverse($input), $end_nonmask_nums); my $end_string = substr $input, -$end_mask_pos; my $mid_string = substr $input, $start_mask_pos, -$end_mask_pos; $mid_string =~ y{0-9}{X}; my $masked_number = $start_string . $mid_string . $end_string; say $masked_number; } sub get_mask_pos { my ($string, $count) = @_; $string =~ m{\d}g for (1 .. $count); return pos $string; } #### $ pm_number_mask.pl 541321069873210200 541321XXXXXXXX0200 5413 21069873210 200 5413 21XXXXXXXX0 200 54 13-21XX XXXXXX02#00 54 13-21XX XXXXXX02#00 1!2@3#4$5%6^7&8*9(0)-0_9+8=7{6}5[4]3<2>1 1!2@3#4$5%6^X&X*X(X)-X_X+X=X{X}X[4]3<2>1