Are you sure you've found the 'sensitive spot' for the problem you've ran into ...?
Trying to put together the parts you came with, I came up with th following code:
#!/usr/bin/perl
use strict;
use warnings;
my $content = <<EOT;
La mitad de las personas con VIH requiere de una atención psicológica
+ y emocional derivada del impacto del diagnóstico o de las consecuen
+cias de la propia infección, una cifra que dobla a la de la població
+n general, según las conclusiones de las IV Jornadas de Divulgación
+sobre VIH que han reunido a unos doscientos profesionales, pacientes
+ y estudiantes en el hospital Reina Sofía de Murcia. En el congreso
+, organizado por Amuvih en colaboración con el servicio de Proyecció
+n Social y Voluntariado de la Universidad de Murcia y Abbott, ha det
+erminado que las personas que viven con VIH demandan especialmente a
+tención a su salud mental para mejorar su calidad de vida, "una asig
+natura pendiente a pesar de los innumerables avances farmacológicos"
+.
Entre otros factores, las jornadas establecieron que en la situación
+de "vulnerabilidad" de las personas con VIH influyen "el propio diag
+nóstico, la comunicación de su situación a los allegados, el inicio
+del tratamiento, las fluctuaciones a lo largo de la infección, la pé
+rdida de salud y deterioro físico, así como los efectos adversos del
+ tratamiento".
Igualmente, otros factores importantes son la pérdida de la motivació
+n, el hastío, el estigma y rechazo, así como las nuevas parejas sexu
+ales, los cambios familiares, laborales y sociales, entre otras cosa
+s, que derivan en "riesgo de depresión mayor, trastorno distímico, t
+rastorno por ansiedad generalizada o trastorno de pánico".
EOT
my $par1 = '[a\xe0\xe1\xe4\xe2A\xc1\xc0\xc4\xc2]bb[o\xf2\xf3\xf6\xf4O\
+xd3\xd2\xd6\xd4]tt';
my $par2 = 's[a\xe0\xe1\xe4\xe2A\xc1\xc0\xc4\xc2]l[u\xf9\xfa\xfc\xfbU\
+xda\xd9\xdc\xdb]d';
my $distance = 20;
use POSIX qw(locale_h);
my $old_locale = setlocale(LC_CTYPE);
setlocale(LC_CTYPE, 'ca_ES.iso885915@euro');
use locale;
my ($res1, $res2, $res3);
my $tag = 'strong ';
my $class = 'class=some_class_here';
my $new_content = $content;
if ($content =~ /\b($par1)(\W+(?:\w+\W+){1,$distance})?($par2)\b/i) {
($res1, $res2, $res3) = ($1, $2, $3);
$new_content =~ s/$res1\Q$res2\E$res3/<$tag$class> $res1<\/$tag>$r
+es2<$tag$class> $res3<\/$tag>/i;
}
if ($content =~ /\b($par2)(\W+(?:\w+\W+){1,$distance})?($par1)\b/i) {
($res1, $res2, $res3) = ($1, $2, $3);
$new_content =~ s/$res1\Q$res2\E$res3/<$tag$class> $res1<\/$tag>$r
+es2<$tag$class> $res3<\/$tag>/i;
}
print "Res1: \n$res1\n\nRes2: \n$res2\n\n Res3: \n$res3\n\n";
exit;
which works fine here. Does it not work for you ...?
Maybe you've just been fooled to believe the problem is here, due to some buffered (and consequently delayed/hidden) output ?