SYNOPSIS
use Algorithm::CheckDigits;
$sici = CheckDigits('sici');
if ($sici>is_valid('07848679(20040308)6:<138>2.0.TX;2H')) {
# do something
}
$cn = $sici>complete('07848679(20040308)6:<138>2.0.TX;2');
# $cn = '07848679(20040308)6:<138>2.0.TX;2H'
$cd = $sici>checkdigit('07848679(20040308)6:<138>2.0.TX;2H');
# $cd = 'H'
$bn = $sici>basenumber('07848679(20040308)6:<138>2.0.TX;2H');
# $bn = '07848679(20040308)6:<138>2.0.TX;2';
DESCRIPTION
ALGORITHM
 0
 In the string describing the number all letters (AZ) are replaced with numbers 1035 accordingly. All other nonnumbers are replaced by 36.
 1
 Beginning right the numbers at all odd positions are added.
 2
 The sum from step 1 is multiplied by 3.
 3
 Beginning right the numbers at all even positions are added.
 4
 The sums from step 2 and 3 are added.
 5
 The sum from step 4 is taken modulo 37.
 6
 The checksum is 37 minus the sum from step 5 where numbers from 10 to 35 are represented by 'A' to 'Z' accordingly and 36 is represented by '#'.
METHODS
 is_valid($number)

Returns true only if $number consists solely of numbers and hyphens
and the two digits in the middle
are valid check digits according to the algorithm given above.
Returns false otherwise,
 complete($number)

The check digit for $number is computed and inserted into the
middle of $number.
Returns the complete number with check digit or '' if $number does not consist solely of digits, hyphens and spaces.
 basenumber($number)

Returns the basenumber of $number if $number has a valid check
digit.
Return '' otherwise.
 checkdigit($number)

Returns the check digits of $number if $number has valid check
digits.
Return '' otherwise.