@@ -, +, @@ subfields (and $9 is in the front); subfield in the field. --- C4/AuthoritiesMarc.pm | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) --- a/C4/AuthoritiesMarc.pm +++ a/C4/AuthoritiesMarc.pm @@ -1473,25 +1473,41 @@ sub merge { my $newtag = $tags_new && @$tags_new ? _merge_newtag( $tag, $tags_new ) : $tag; - my $field_to = MARC::Field->new( - $newtag, - $field->indicator(1), - $field->indicator(2), - "9" => $mergeto, - ); - foreach my $subfield ( grep { $_->[0] ne '9' } @record_to ) { - $field_to->add_subfields( $subfield->[0] => $subfield->[1] ); - } + my (@prefix, @postfix); if ( !$overwrite ) { # add subfields back in loose mode, check skip_subfields + # check the relative position resp. controlled subfields + my $prefix_flag = 1; foreach my $subfield ( $field->subfields ) { - next if $skip_subfields->{ $subfield->[0] }; - $field_to->add_subfields( $subfield->[0], $subfield->[1] ); + if ( $skip_subfields->{ $subfield->[0] } ) { + $prefix_flag = 0; + next; + } + if ($prefix_flag) { + push @prefix, [ $subfield->[0], $subfield->[1] ] ; + } else { + push @postfix, [ $subfield->[0], $subfield->[1] ] ; + } + } + } + my $field_to; + foreach my $subfield ( grep { $_->[0] ne '9' } (@prefix, @record_to, @postfix) ) { + unless ($field_to) { + $field_to = MARC::Field->new( + $newtag, + $field->indicator(1), + $field->indicator(2), + $subfield->[0] => $subfield->[1], + ); + } else { + $field_to->add_subfields( $subfield->[0] => $subfield->[1] ); } } + $field_to->add_subfields( 9 => $mergeto ); + if ($tags_new && @$tags_new) { $marcrecord->delete_field($field); - append_fields_ordered( $marcrecord, $field_to ); + $marcrecord->insert_fields_ordered($field_to); } else { $field->replace_with($field_to); } --