in reply to slurped scalar map

If you can rely on the fixed offset of the data in a line, unpack, or substr/regex matching will get you the data. It will be easier if you split the file into an array of lines, or else originally slurp it that way,

my @lines = <$handle>; my %record; for (@lines) { next unless /^\| (\w+) \| (\d+)/; $record{$1} = $2; }
That doesn't just assign one value to one variable which is named after another piece of the data; it associates all those other pieces with their data.

You wind up with a more useful and easier-to-manage representation of the data in your file.

If you're stuck with that scalar variable, you can use the same regex globally,

my %record = $data =~ /^\| (\w+) \| (\d+)/g;
That looks simpler, but it is, IMO, more fragile.

To get exactly what you asked for, knowing the offset and length of the field,

my $rec1ref = \substr $data, $offset, $len; $$rec1ref = $newval;
If length($newval) != $len, the offsets to subsequent data will be disturbed and the data seen in $$rec1ref will be truncated or augmented.

After Compline,
Zaxo