my %map = map { $_ => $_ } 0..9; sub check_digit { my @buf = reverse split //, shift; my $totalVal = 0; my $flip = 1; foreach my $c (@buf) { my $posVal = $map{$c}; $posVal *= 2 unless $flip = !$flip; while ($posVal) { $totalVal += $posVal % 10; $posVal = int($posVal / 10); } } return (10 - $totalVal % 10) % 10; } # example use for (401135000000000..401135000000099) { my $cd=check_digit($_); print "$_$cd\n"; }