On 1/23/06, Chris Cosner <[EMAIL PROTECTED]> wrote: > Hello, > > I have some data coming into a system with markup that I need to > reinterpret into HTML. I have a feeling I'm making this problem more > complex than it needs to be. > > The beginning and ending markup are the same. So <I>text<I> would > become <I>text</I> in HTML. A single line can have more than one of > these italicized words, for example. > > So this doesn't work: > s/(\<I\>)(.*)(\<I\>)/$1$2\<\/I\>/g > because .* matches anything in between and only the last one is > considered. <I>text<I>blahblah<I>text<I> becomes > <I>textblahblahtext</I>. > > I would like it to match every second <I> and replace it with </I>, no > matter how many occurrences in a line. Am I on the right track with > something like this?:
Just use the "non-greedy" form of "*": s{(\<I\>)(.*?)(\<I\>)}{$1$2\<\/I\>}g should do what you want. > for $line (@descriptions) { > ... > $count = 0; > $line =~ > s{ > \<I\> > }{ > if (++$count==2){ > \<\/I\> > } > else { > \<I\> > } > }gex; > ... > } > which gives me the following error: > Unterminated <> operator at program.pl line 48. > Line 48 is }{ > So I have the syntax wrong, at the very least. > > Should I be thinking more in terms of some sort of lookahead? > > Any hints as to how to approach this will be appreciated. > > -Chris Cosner The problem here is that once you use "e", the second part of the statement is an expression, and needs to evaluate as perl.Your "if" construction doesn't. if ($count == 2) {<I>} for instance, doen't work. Perl can't execute <I> (which is what ti seems to think you meant by \<\/I\>) even if it wants to. If the s/// operator is confusing, think about what would happen if you tried to do something like: my $var = {your code} The second half of the substitution will get whatever would end of in the variable if you were assigning to a variable instead of performing a substitution. You also don't seem to actually increment count anywhere. Try something more like my $count = 0 ; s/\<I\>/ sub { $count++; my $return; if ($count == 2) { $count = 0; $return = '<\I>'; } else { $return = '<I>'; } return $return; } /gxe; # untested, but you get the idea: # you need to return a value to be substituted HTH, -- jay -------------------------------------------------- This email and attachment(s): [ ] blogable; [ x ] ask first; [ ] private and confidential daggerquill [at] gmail [dot] com http://www.tuaw.com http://www.dpguru.com http://www.engatiki.org values of β will give rise to dom!