Просто небольшая поправка, но оба ваших регулярных выражения не делают то, что вы думаете.
/[a-f,0-9]/
Соответствует любому символу от a до f, от 0 до 9, и запятой. Вы ищете
/[a-z0-9]/
Не то, что это нарушает вашу программу (M42, вероятно, понял это правильно, но мы не можем быть уверены, если вы не покажете нам хэш).
Кроме того, извинения, недостаточно репутации, чтобы фактически ответить на другие сообщения.
РЕДАКТИРОВАТЬ: Ну, вы проходите много обручей в этом ответе, поэтому вот как я это сделаю вместо этого:
s/14'h\K(\p{AHex}{4})/if (defined($hash_point->{$1})) {
$hash_point->{$1};
} else {
say $1 if $flag;
$1;
}/ge
Главным образом потому, что цепочки, а также & && и sosuch обычно создают довольно сложный для понимания код.Все пробелы необязательны, так что раздавите их для однострочника!