+
+ if (my $replace = $charset->{replace}) {
+ while (my ($offset, $sub) = each %{$replace}) {
+ $offset -= $row{offset};
+
+ if (ref $row{table} eq 'ARRAY') {
+ $row{table}->[$offset] = $sub
+ if $offset >= 0 and $offset <= $row{endpoint};
+ next;
+ }
+
+ my $length = length $sub;
+
+ if ($offset < 0) {
+ $offset > -$length or next; # at least one character after start
+ # trim leftmost part to start at offset
+ substr($sub, 0, -$offset) = '';
+ $length += $offset;
+ $offset = 0;
+ }
+
+ if ((my $excess = $row{endpoint} - $offset - $length + 1) < 0) {
+ $excess > -$length or next;
+ # trim rightmost part to prevent overflow
+ substr($sub, $excess) = '';
+ $length += $excess;
+ }
+
+ substr($row{table}, $offset, $length) = $sub;
+ }
+ }
+
+ push @request, \%row;
+ $visible->{ $row{set} } = 1 if $row{table};