* fixed checksum routine. the old test data ended in zero,
so when i kept getting zero, it didn't realize something was
wrong. when i added more ISMNs, it figured it out.
brian d foy
21 years ago
0 | |
M-021-76543-0
|
|
0 |
M-706208-05-3
|
|
1 |
M-706208-01-5
|
|
2 |
M-706208-02-2
|
|
3 |
M-706208-05-3
|
|
4 |
M-706208-06-0
|
|
5 |
M-706208-09-1
|
|
6 |
M-706208-10-7
|
|
7 |
M-706208-11-4
|
|
8 |
M-706208-12-1
|
|
9 |
M-706217-00-0
|
|
10 |
M-706217-01-7
|
|
11 |
M-706217-02-4
|
|
12 |
M-706228-01-3
|
|
13 |
M-706228-02-0
|
|
14 |
M-50093-001-3
|
|
15 |
M-2020-0651-1
|
|
16 |
M-2020-0291-9
|
|
17 |
M-2019-7401-9
|
|
18 |
M-50093-001-3
|
|
19 |
M-50093-002-0
|
|
20 |
M-50093-005-1
|
|
21 |
M-50093-007-5
|
|
22 |
M-50093-008-2
|
|
23 |
M-50093-010-5
|
|
24 |
M-50093-011-2
|
|
25 |
M-50093-012-9
|
|
26 |
M-50093-015-0
|
|
27 |
M-50093-016-7
|
|
28 |
M-50093-017-4
|
|
29 |
M-50093-018-1
|
|
30 |
M-50093-020-4
|
|
31 |
M-50093-021-1
|
|
32 |
M-50093-022-8
|
|
33 |
M-50093-023-5
|
|
34 |
M-50093-024-2
|
|
35 |
M-50093-025-9
|
|
36 |
M-50093-026-6
|
|
37 |
M-50093-027-3
|
|
38 |
M-50093-029-7
|
|
39 |
M-50093-030-3
|
|
40 |
M-50093-031-0
|
|
41 |
M-50093-032-7
|
|
42 |
M-50093-026-6
|
|
43 |
M-50093-028-0
|
|
44 |
M-50093-033-4
|
|
45 |
M-50093-029-7
|
|
46 |
M-50093-034-1
|
|
47 |
M-50093-035-8
|
|
48 |
M-50093-035-8
|
|
49 |
M-50093-032-7
|
|
50 |
M-50093-036-5
|
|
51 |
M-50093-024-2
|
|
52 |
M-50093-009-9
|
|
53 |
M-50093-038-9
|
|
54 |
M-50093-039-6
|
|
55 |
M-50093-016-7
|
|
56 |
M-50093-041-9
|
|
57 |
|
0 | 0 |
package Business::ISMN;
|
1 | |
# $Revision: 1.1 $
|
2 | |
# $Id: ISMN.pm,v 1.1 2002/09/09 16:38:25 comdog Exp $
|
|
1 |
# $Revision: 1.2 $
|
|
2 |
# $Id: ISMN.pm,v 1.2 2002/09/09 19:52:01 uid59984 Exp $
|
3 | 3 |
|
4 | 4 |
use strict;
|
5 | 5 |
use subs qw( _common_format _checksum is_valid_checksum
|
|
13 | 13 |
|
14 | 14 |
use Exporter;
|
15 | 15 |
use List::Util qw(sum);
|
16 | |
use Tie::Toggle;
|
|
16 |
use Tie::Cycle;
|
17 | 17 |
use Business::ISMN::Data;
|
18 | 18 |
|
19 | 19 |
my $debug = 0;
|
|
22 | 22 |
@EXPORT_OK = qw(is_valid_checksum ean_to_ismn ismn_to_ean
|
23 | 23 |
INVALID_PUBLISHER_CODE BAD_CHECKSUM GOOD_ISMN BAD_ISMN);
|
24 | 24 |
|
25 | |
($VERSION) = q$Revision: 1.1 $ =~ m/(\d+\.\d+)\s*$/;
|
|
25 |
($VERSION) = q$Revision: 1.2 $ =~ m/(\d+\.\d+)\s*$/;
|
26 | 26 |
|
27 | 27 |
sub INVALID_PUBLISHER_CODE { -3 };
|
28 | 28 |
sub BAD_CHECKSUM { -1 };
|
|
259 | 259 |
sub _checksum
|
260 | 260 |
{
|
261 | 261 |
my $data = _common_format shift;
|
262 | |
$data =~ s/^M/1/i;
|
263 | |
|
264 | |
tie my $factor, 'Tie::Toggle', [ 3, 1 ];
|
|
262 |
|
|
263 |
tie my $factor, 'Tie::Cycle', [ 1, 3 ];
|
265 | 264 |
return unless defined $data;
|
266 | 265 |
|
267 | |
my $sum = sum( map $factor * $_, substr( $data, 0, 9 ) );
|
268 | |
|
|
266 |
my $sum = 9;
|
|
267 |
|
|
268 |
foreach my $digit ( split //, substr( $data, 1, 8 ) )
|
|
269 |
{
|
|
270 |
my $mult = $factor;
|
|
271 |
$sum += $digit * $mult;
|
|
272 |
}
|
|
273 |
|
|
274 |
|
269 | 275 |
#return what the check digit should be
|
270 | |
my $checksum = $sum % 10;
|
271 | |
|
|
276 |
# the extra mod 10 turns 10 into 0.
|
|
277 |
my $checksum = ( 10 - ($sum % 10) ) % 10;
|
|
278 |
|
272 | 279 |
return $checksum;
|
273 | 280 |
}
|
274 | 281 |
|
0 | |
# $Revision: 1.1 $
|
|
0 |
# $Revision: 1.2 $
|
1 | 1 |
|
2 | 2 |
use Test::More tests => 18;
|
3 | 3 |
|
4 | 4 |
use Business::ISMN;
|
5 | 5 |
|
6 | |
my $GOOD_ISMN = "M021765430";
|
7 | |
my $GOOD_ISMN_STRING = "M-021-76543-0";
|
8 | |
my $GOOD_EAN = "9790021765439";
|
9 | |
my $PUBLISHER = "021";
|
10 | |
my $BAD_CHECKSUM_ISMN = "M021765436";
|
|
6 |
my $GOOD_ISMN = "M706208053";
|
|
7 |
my $GOOD_ISMN_STRING = "M-706208-05-3";
|
|
8 |
my $GOOD_EAN = "9790706208053";
|
|
9 |
my $PUBLISHER = "706208";
|
|
10 |
my $BAD_CHECKSUM_ISMN = "M706208057";
|
11 | 11 |
my $BAD_PUBLISHER_ISMN = "M456922572";
|
12 | 12 |
my $NULL_ISMN = undef;
|
13 | 13 |
my $NO_GOOD_CHAR_ISMN = "abcdefghij";
|
|
74 | 74 |
while( <FILE> )
|
75 | 75 |
{
|
76 | 76 |
chomp;
|
|
77 |
next unless /\S+/;
|
77 | 78 |
my $ismn = Business::ISMN->new( $_ );
|
78 | 79 |
|
79 | 80 |
my $result = $ismn->is_valid;
|