7 use Data::Dump qw(dump);
9 my $source = shift @ARGV || die "usage: $0 file.m21\n";
13 close(STDERR) unless $ENV{DEBUG};
15 open(my $m21, '<:encoding(utf-8)', $source);
16 open(my $out, '>:encoding(utf-8)', $dest);
18 warn "# convert $source => $dest\n";
25 $marc = new MARC::Record;
26 $marc->encoding('utf-8');
38 my ( $id, $rest ) = split(/\s/, $_, 2);
39 my ( $fffii, $sf ) = split(/\s+L\s+/,$rest,2);
41 warn "## ",dump( $id, $fffii, $sf );
43 $last_id = $id if ! defined $last_id;
44 if ( $id != $last_id ) {
45 print $out $marc->as_usmarc;
47 print $marc->as_formatted();
53 if ( $fffii eq 'LDR' ) {
56 } elsif ( $fffii =~ m/^00/ ) {
57 warn "# $id clean $fffii" if $fffii =~ s/[a-z]//g;
58 my $field = MARC::Field->new( $fffii, $sf );
59 $marc->append_fields( $field );
61 my $f = $1 if $fffii =~ s/^(...)//;
62 my $i1 = $1 if $fffii =~ s/^(.)//;
63 my $i2 = $1 if $fffii =~ s/^(.)//;
67 warn "# $id $fffii -> ", dump($f,$i1,$i2), " [$sf]\n";
69 my @f = ( $f, $i1, $i2 );
71 while ( $sf =~ s/^\$\$(\w)([^\$]+)// ) {
72 # push @f, $1, decode('iso-8859-1', $2);
75 warn "### ",dump( @f );
78 eval { $field = MARC::Field->new( @f ) };
80 if ( $@ =~ m/must have indicators/ ) {
86 $marc->append_fields( $field );