サンプルコード
my $isbn9 = '457606017';
print "$isbn9\n";
my $digit = calc_check_digit($isbn9);
my $isbn = $isbn9.$digit;
print "$isbn9\-$digit\n";
print isbn2hyphen($isbn);
実行結果
457606017
457606017-1
4-576-06017-1
ちなみにこのISBNコードは、ファントム。
sub calc_check_digit {
my $isbn = shift;
$isbn =~ s/\D//g;
chop $isbn while ( 9 < length $isbn );
my $product = 0;
my @digit = split //, $isbn;
foreach my $weight ( 2..10 ) {
$product += $weight * pop @digit;
}
my $check_digit = (qw(X 9 8 7 6 5 4 3 2 1 0))[($product % 11)-1];
return $check_digit;
}
10桁のハイフンなしISBNにハイフンを復元する。
sub isbn2hyphen {
my $isbn = shift ;
my $code = substr $isbn, 1, 2;
my $digit = 2;
if ( $code < 20 ) {
} elsif ( $code < 70 ) {
$digit = 3;
} elsif ( $code < 85 ) {
$digit = 4;
} elsif ( $code < 90 ) {
$digit = 5;
} elsif ( $code < 95 ) {
$digit = 6;
} else {
$digit = 7;
}
my @isbn = split //, $isbn;
my $result = shift @isbn;
$result .= '-';
map { $result .= shift @isbn } ( 1..$digit );
$result .= '-';
map { $result .= shift @isbn } ( 1..(8-$digit) );
$result .= '-';
$result .= shift @isbn;
return $result;
}