$line =~ s/ \*{2} ( [^\*]+ ) \*{2} \s ( kinase | isoform | protein | peptide | ligand ) \s \${2} ( [^\$]+ ) \${2} \s [(,] \s \*{2} ( [^\*]+ ) \*{2} \s [),] /**$1_$2_$3_($4)**/gx #### sub delimited { my ( $delimiter ) = @_; my $qdelimiter = quotemeta $delimiter; return qr/ $qdelimiter{2} ( [^$qdelimiter]+ ) $qdelimiter{2} /x; } sub balanced { my ( $inside ) = @_; return qr/ [(,] $inside [),] /x; } my $stars = delimited '*'; my $dollars = delimited '$'; my $words = qr/( kinase | isoform | protein | peptide | ligand )/x; my $parens = balanced qr/ \s $stars \s /x; $line =~ s/ $stars \s $words \s $dollars \s $parens /**$1_$2_$3_($4)**/gx;