A fly in the ointment was in the code for our $s (@stops). The code wouldn't work here with a 'my' declaration. 'our' was necessary.
This is a bug that was corrected in Perl version 5.18 IIRC. With this correction, lexical variables always work as expected in "(?{ code })" and "(??{ code })" regex constructs.
The dynamic regex form was necessary because the count of the quantifier changed for each iteration of the 'for' loop ($s-1).
I don't see the necessity here. Except for the fact that aliasing into the @stop array makes calculating the quantifier a bit tedious, it can all be written normally, given that the s/// match regex is, by default, re-compiled on each s/// execution:
And except for say, it works under Perl version 5.8.9. See also Re: Regex to match range of characters broken by dashes Update 2 for another for-loop example.c:\@Work\Perl\monks>perl -wMstrict -le "my @stops = (2,6); ;; my $tag = '___'; ;; for ('ATCGGATCTGGC', 'A-C-G--CTGGC') { my $seq = $_; printf qq{'$seq' -> }; ;; for our $s (@stops) { local our $q = $s - 1; $seq =~ s/ ((?:[TAGC][^TAGC]*){$q} [TAGC]) /$1$tag/x; } print qq{'$seq'}; } " 'ATCGGATCTGGC' -> 'AT___CGGA___TCTGGC' 'A-C-G--CTGGC' -> 'A-C___-G--CTG___GC'
Update: I've based my code example on your original code, prior to adding the second s/// fixup.
Give a man a fish: <%-{-{-{-<
In reply to Re^2: Regex to match range of characters broken by dashes
by AnomalousMonk
in thread Regex to match range of characters broken by dashes
by Q.and
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |