sub checkUPCGrandFather2 { my $str = shift; return "should be 12 digits in length" if length ($str) != 12; my $t = 0; my $sum = 0; # loop through to sum even and adjusted odd chars for (0..10) { my $chr = substr $str, $_, 1; $sum += ($t ^= 1) ? $chr * 3 : $chr; } # calculate correct check digit my $check = (10 - $sum % 10) % 10; # return error message if wrong check digit was initially given return ($check != substr $str, 11) ? "invalid checkdigit...should be $check" : 'Ok'; }