/usr/share/perl5/Business/ISBN13.pm is in libbusiness-isbn-perl 3.003-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | package Business::ISBN13;
use strict;
use base qw(Business::ISBN);
use Business::ISBN qw(:all);
use Data::Dumper;
use vars qw(
$VERSION
$debug
);
use Carp qw(carp croak cluck);
my $debug = 0;
$VERSION = '3.003';
sub _max_length { 13 }
sub _set_type { $_[0]->{type} = 'ISBN13' }
sub _parse_prefix {
my $isbn = $_[0]->isbn; # stupid workaround for 'Can't modify non-lvalue subroutine call'
( $isbn =~ /\A(97[89])(.{10})\z/g )[0];
}
sub _set_prefix {
croak "Cannot set prefix [$_[1]] on an ISBN-13"
unless $_[1] =~ m/\A97[89]\z/;
$_[0]->{prefix} = $_[1];
}
sub _hyphen_positions {
[
$_[0]->_prefix_length,
$_[0]->_prefix_length + $_[0]->_group_code_length,
$_[0]->_prefix_length + $_[0]->_group_code_length + $_[0]->_publisher_code_length,
$_[0]->_checksum_pos,
]
}
# sub group { 'Bookland' }
sub as_isbn10 {
my $self = shift;
return unless $self->prefix eq '978';
my $isbn10 = Business::ISBN->new(
substr( $self->isbn, 3 )
);
$isbn10->fix_checksum;
return $isbn10;
}
sub as_isbn13 {
my $self = shift;
my $isbn13 = Business::ISBN->new( $self->as_string );
$isbn13->fix_checksum;
return $isbn13;
}
#internal function. you don't get to use this one.
sub _checksum {
my $data = $_[0]->isbn;
return unless defined $data;
my @digits = split //, $data;
my $sum = 0;
foreach my $index ( 0, 2, 4, 6, 8, 10 )
{
$sum += substr($data, $index, 1);
$sum += 3 * substr($data, $index + 1, 1);
}
#take the next higher multiple of 10 and subtract the sum.
#if $sum is 37, the next highest multiple of ten is 40. the
#check digit would be 40 - 37 => 3.
my $checksum = ( 10 * ( int( $sum / 10 ) + 1 ) - $sum ) % 10;
return $checksum;
}
1;
__END__
=encoding utf8
=head1 NAME
Business::ISBN13 - work with 13 digit International Standard Book Numbers
=head1 SYNOPSIS
See L<Business::ISBN>
=head1 DESCRIPTION
See L<Business::ISBN>
=head1 SOURCE AVAILABILITY
This source is in Github.
https://github.com/briandfoy/business-isbn
=head1 AUTHOR
brian d foy C<< <bdfoy@cpan.org> >>
=head1 COPYRIGHT AND LICENSE
Copyright © 2001-2016, brian d foy <bdfoy@cpan.org>. All rights reserved.
This module is licensed under the Artistic License 2.0. See the LICENSE
file in the distribution, or https://opensource.org/licenses/Artistic-2.0
=cut
|