use Benchmark 'cmpthese'; our $str1 = "12345 ABC 987 MNO"; our $str2 = " CDE"; sub merge_csebe { my( $s1, $s2 ) = map { [ split //, $_ ] } @_; for ( my $i = 0; $i < @$s1; $i++ ) { if( $s2->[$i]) { if( ( $s1->[$i] ne q{ } ) && ( $s2->[$i] eq q{ } ) ) { $s2->[$i] = $s1->[$i]; } } else { $s2->[$i] = $s1->[$i]; } } return join q{}, @$s2; } sub merge_bitwise { my $s2 = $_[1] =~ tr/ /\x{0}/r; return $s2 | $_[0] & ( "\x{ff}" x length $_[0] ^ $s2 =~ tr/\x{00}/\x{FF}/cr ); } sub merge_resubstr { my $s1 = shift; while( $_[0] =~ m/(\S+)/g ) { substr( $s1, pos($_[0])-length($1), length($1) ) = $1; } return $s1; } sub merge_moritz { my $pos = 0; my $res = ''; for my $chunk (split /([^ ]+)/, $_[1]) { if (substr($chunk, 0, 1) eq ' ') { $res .= substr $_[0], $pos, length $chunk; } else { $res .= $chunk; } } continue { $pos += length $chunk; } if ($pos < length $_[0]) { $res .= substr $_[0], $pos; } return $res; } print "Implementations check OK.\n" if( 4 == grep { $_ eq '12345 CDE 987 MNO' } merge_bitwise($str1,$str2), merge_resubstr($str1,$str2), merge_moritz($str1,$str2), merge_csebe($str1,$str2), ); cmpthese ( -5, { bitwise => sub { my $rv = \&merge_bitwise ($main::str1,$main::str2) }, resubst => sub { my $rv = \&merge_resubstr($main::str1,$main::str2) }, moritz => sub { my $rv = \&merge_moritz ($main::str1,$main::str2) }, csebe => sub { my $rv = \&merge_csebe ($main::str1,$main::str2) }, } );