Ramprasad wrote: > John W. Krahn wrote: > > Ramprasad wrote: > > > > > if I have > > > my $str = 'aw bcdefaw e a rt zzz kjkjkjaw qa' ; > > > > > > If I wish to replace everything between 'a' and 'zzz' With 'TXT' > > > I do > > > > > > $str=~s/a[^a]+zzz/aTXTzzz/; > > > This works fine. > > > > > > Now if I wish to replace everything between 'aw' and 'zzz' with > > > 'TXT' I am not able to use > > > > > > $str=~s/aw[^(aw)]+zzz/awTXTzzz/; > > > > > > I know I can use > > > $str=~s/^(.*)aw.*?zzz/$1awTXTzzz/s; > > > > > > But this seems to be a very untidy way beacuse In my real > > > program $str is an entire file in a string and could be a very > > > long one > > > > > > Is there a better way > > > > > > You can use positive look-behind and positive look-ahead: > > > > $ perl -e' > > my $str = q/aw bcdefaw e a rt zzz kjkjkjaw qa/; > > print "$str\n"; > > $str =~ s/(?<=\ba\b).*?(?=\bzzz\b)/TXT/; > > print "$str\n"; > > ' > > aw bcdefaw e a rt zzz kjkjkjaw qa > > aw bcdefaw e aTXTzzz kjkjkjaw qa > > > > > > Now How do I replace everything between the innermost 'aw' and > 'zzz'?
Combining John's answer and a variant of Michael's: my $str = q/aw bcdefaw e a rt zzz kjkjkjaw qa/; print "$str\n"; # Look for a string $str =~ s/ (?<=aw) # Preceded by 'aw' ((?!aw).)*? # Not containing 'aw' (?=zzz) # followed by 'zzz' /TXT/x; print "$str\n"; OUTPUT aw bcdefawTXTzzz kjkjkjaw qa HTH, Rob -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]