/usr/share/perl5/Business/ISBN13.pm is in libbusiness-isbn-perl 2.010-1ubuntu2.
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 127 128 129 130 131 132 133 | package Business::ISBN13;
use strict;
use base qw(Business::ISBN);
use Business::ISBN qw(:all);
use Data::Dumper;
use subs qw(
_checksum
INVALID_COUNTRY_CODE
INVALID_PUBLISHER_CODE
BAD_CHECKSUM
GOOD_ISBN
BAD_ISBN
);
use vars qw(
$VERSION
$debug
);
use Carp qw(carp croak cluck);
my $debug = 0;
$VERSION = '2.010';
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-2015, brian d foy <bdfoy@cpan.org>. All rights reserved.
You may redistribute this under the same terms as Perl itself.
=cut
|