use strict; use warnings; use List::Util qw/sum/; my $test_number = 123456789012; $test_number =~ m/^\d{12}$/ or die "Invalid code.\n"; my( @even ) = reverse( $test_number ) =~ m/\d(\d)/g; my( @odd ) = reverse( $test_number ) =~ m/(\d)\d?/g; my $checksum = sum( @odd ) * 3 + sum( @even ); print $checksum, "\n";