Я не собираюсь пытаться по-настоящему исправить логику того, что вы пытаетесь достичь, потому что это довольно плохо советовали. Что я сделаю, так это предложу несколько рекомендаций по семантике и кодированию.
1: используйте Regexp :: Common и URI для работы с URL. Почти никогда не стоит писать свои собственные регулярные выражения. Для анализа HTML с помощью регулярных выражений необходимо, чтобы вы серьезно знали, что делаете. https://metacpan.org/search?q=regexp%3A%3Acommon
2: всегда используйте только {} и // для переноса регулярных выражений. (Правило 99%)
3: Всегда сразу копируйте пронумерованные переменные в переменные my () со значимыми именами, если выражение не тривиально.
4: Модифицируйте массивы на месте с постфиксным foreach.
5: Расширьте форматирование кода, чтобы сделать его визуально привлекательным.
6: Используйте sprintf для сложных рекомбинаций переменных. Намного легче увидеть, какая переменная используется, где и для чего.
HTH
# 1 2 3 4 5
s{(class="p_hw"><a href=\")(http://[^<>"]*?xxxx\.com/[^<>"]*[=/])([^<>\"]*)(\">(?:<b>)?)(.*?)(?=<)}{
my ($m1, $m2, $m3, $m4, $m5) = ($1, $2, $3, $4, $5);
my @n = split /[,|;]/, $m5;
s/^\s+|\s+$//mg foreach @n;
(my $new = $m3) =~ s/^\s+|\s+$//mg;
(my $new2 = $new) =~ s/\+/ /g;
exists $hw_f{$new2} ?
sprintf "%sentry://%s%s%s", $m1, $new2, $m4, $m5 :
exists $hw_f{$n[0]} ?
sprintf "%sentry://%s%s%s", $m1, $n[0], $m4, $m5 :
"$m1$m2$m3$m4$m5";
}ige;