Raghupathy wrote: > Rob, > > The input file you described is not correct, since > it has > #ifdef def2 > statement3; > #else > statement4; > #endif > nested within another #ifdef ... #else ... #endif. > > My input file is the output of > "diff -D def file1 file2" (on unix). This will > generate a file which has the following patterns and > none of the patterns can be nested within the other: > > #ifdef .... #else ... #endif > #ifndef .... #else ... #endif > #ifdef .... #endif > #ifndef .... #endif > > I need to substitute the above patterns to be read > by a home grown program. > > I encountered a problem due to the following > reason. > There was: > > #ifndef def .... #endif def - Call it sentence1 > #ifndef def ... #else def ... #endif def - Call it > sentence2 > > I tried the following line but it matched sentence1 > and sentence2 together. I need to match sentence1 and > sentence2 seperately. > $line1 =~ > m/#ifndef\s+def(.*?)#else\s+def(.*?)#endif\s+def/isg > > For this > #ifndef def (...1...) #else def (...2...) #endif def > > should be matched only if #if is not there within > (...1...) and (...2...). > > Hopefully I have conveyed it more clearly.
still not quit sure what you need but try the following: #!/usr/bin/perl -w use strict; my $code =<<C; #ifdef debug debug defined! #endif debug #ifndef fork no fork no pfork #else fork great os #endif fork C while($code =~ / \#if n? def \s+ ([^\n]+) (.*?) (?: \#else \s+ \1 (.*?) )? \#endif \s+ \1 /gsx){ my $if = $2; my $else = $3 || ''; print "$1:",$if; print "$1 else: ",$else if($else); } __END__ prints: debug: debug defined! fork: no fork no pfork fork else: great os not sure if that's what you want. david -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]