Une autre possibilité c'est d'utiliser un test avant qui ne consomme pas de texte, comme ça tu ne fais q'une seule capture.
#! /usr/bin/perl
use warnings;
while (<>)
{
s/\b(?= # teste avant si on a
\w+\@art # coucou@art
\[ # a partir de [
( # on capture ce que nous interesse dans $1
[^\]]+
)
\]
)\b
/+$1+ /xg; # on ajoute $1 avant coucou @art[contenu] dans ma ligne
print;
}

