#!/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; }