my %fields;
for my $f (@field_list) {
$f =~ s/^\s*//; $f =~ s/\s*$//;
- if ($f =~ /^(.{3})(\w*)(?:\[([^]]*)\])?$/) {
- my $field = $1;
- $field =~ s/\s+//;
- my $sf = $2;
- $sf =~ s/\s+//;
- my $match = $3;
- $match =~ s/^\s*//; $match =~ s/\s*$//;
+ if ($f =~ /^(.{3})(?:_(..))?(\w*)(?:\[([^]]*)\])?$/) {
+ my $field = $1; $field =~ s/\s+//;
+ my $ind = $2; $ind =~ s/\s+//;
+ my $sf = $3; $sf =~ s/\s+//;
+ my $match = $4; $match =~ s/^\s*//; $match =~ s/\s*$//;
$fields{$field} = { sf => [ split('', $sf) ] };
+ if ($ind) {
+ my ($i1,$i2) = split('', $ind);
+ $fields{$field}{ind1} = $i1 if ($i1 ne '_');
+ $fields{$field}{ind2} = $i2 if ($i2 ne '_');
+ }
if ($match) {
my ($msf,$mre) = split('~', $match);
if (length($msf) > 0 and length($mre) > 0) {
for my $from_field ($source_r->field( $f )) {
my @tos = $target_r->field( $f );
if (!@tos) {
+ next if (exists($fields{$f}{ind1}) and !$force_add);
+ next if (exists($fields{$f}{ind2}) and !$force_add);
next if (exists($fields{$f}{match}) and !$force_add);
my @new_fields = map { $_->clone } $source_r->field( $f );
$target_r->insert_fields_ordered( @new_fields );
} else {
for my $to_field (@tos) {
+ next unless ($to_field->indicator(1) eq $fields{$f}{ind1}) if (defined($fields{$f}{ind1}));
+ next unless ($to_field->indicator(2) eq $fields{$f}{ind2}) if (defined($fields{$f}{ind2}));
if (exists($fields{$f}{match})) {
next unless (grep { $_ =~ $fields{$f}{match}{re} } $to_field->subfield($fields{$f}{match}{sf}));
}
for my $old_sf ($from_field->subfields) {
$to_field->add_subfields( @$old_sf ) if grep(/$$old_sf[0]/,@{$fields{$f}{sf}});
}
+ $to_field->update(
+ ind1 => $from_field->indicator(1),
+ ind2 => $from_field->indicator(2),
+ );
}
}
}
my %fields;
for my $f (@field_list) {
$f =~ s/^\s*//; $f =~ s/\s*$//;
- if ($f =~ /^(.{3})(\w*)(?:\[([^]]*)\])?$/) {
- my $field = $1;
- $field =~ s/\s+//;
- my $sf = $2;
- $sf =~ s/\s+//;
- my $match = $3;
- $match =~ s/^\s*//; $match =~ s/\s*$//;
+ if ($f =~ /^(.{3})(?:_(..))?(\w*)(?:\[([^]]*)\])?$/) {
+ my $field = $1; $field =~ s/\s+//;
+ my $ind = $2; $ind =~ s/\s+//;
+ my $sf = $3; $sf =~ s/\s+//;
+ my $match = $4; $match =~ s/^\s*//; $match =~ s/\s*$//;
$fields{$field} = { sf => [ split('', $sf) ] };
+ if ($ind) {
+ my ($i1,$i2) = split('', $ind);
+ $fields{$field}{ind1} = $i1 if ($i1 ne '_');
+ $fields{$field}{ind2} = $i2 if ($i2 ne '_');
+ }
if ($match) {
my ($msf,$mre) = split('~', $match);
if (length($msf) > 0 and length($mre) > 0) {
for my $f ( keys %fields) {
for my $to_field ($r->field( $f )) {
+ next unless ($to_field->indicator(1) eq $fields{$f}{ind1}) if (defined($fields{$f}{ind1}));
+ next unless ($to_field->indicator(2) eq $fields{$f}{ind2}) if (defined($fields{$f}{ind2}));
if (exists($fields{$f}{match})) {
next unless (grep { $_ =~ $fields{$f}{match}{re} } $to_field->subfield($fields{$f}{match}{sf}));
}