in reply to Search and Replace Within Subscopes

I'm not sure I get the question (or the relation to vi), but if you're just talking about reformatting code as shown in your example, here's one way:
{ local $/; # go to slurp mode for input open( I, "<", "my_source_code" ) or die "my_source_code: $!"; $_ = <I>; close I; s/(if.*?)\s+{/$1 {/g; # fix spacing/line-breaks for "if .... {" open( O, ">", "my_new_source_code" ) or die "my_new_source_code: $ +!"; print O; close O; }
Obviously, if the data being edited contains stuff like this:
if ( "blah { blah } blah" ) { ...
then it will get seriously screwed up simply not do what you intended, so maybe something more constrained:
s/(if.*?\))[ \r\t]*\n\s+{/$1 {/; # fix spacing/line-breaks for " +if (...) {"
which involves looking specifically for "if" plus some minimal number of non-line-break characters, followed by close-paren, followed a line-break (which might be surrounded by other kinds of whitespace). Even then, it's worth checking to see that the input and output meet your expectations.

(updated second s/// example to include "\r")

Replies are listed 'Best First'.
Re^2: Search and Replace Within Subscopes
by DanielNeedles (Novice) on Jul 04, 2008 at 16:06 UTC
    Thanks for the response. Though correct, I am trying to get around multiple passes and extra complexity. Ideally I am looking for something to first identify a series of scopes via REGEX and then do a regular search and replace on these scopes ignoring anything outside those scopes. This is a common problem to solve in config management. I am thinking there might be an easy way to do this since it is built in vi which came long before perl. There isn't anything in the new features additions in regex with 5.10 are there?
      There isn't anything in the new features additions in regex with 5.10 are there?
      I don't know, but you can see what's new for 5.10 at perldelta.