Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine

Re: Matching parens on a regex is beating me

by Roy Johnson (Monsignor)
on Apr 22, 2008 at 18:33 UTC ( #682246=note: print w/replies, xml ) Need Help??

in reply to Matching parens on a regex is beating me

perldoc -q matching:

How do I find matching/nesting anything?

This isn't something that can be done in one regular expression, no matter how complicated. To find something between two single characters, a pattern like /x([^x]*)x/ will get the intervening bits in $1. For multiple ones, then something more like /alpha(.*?)omega/ would be needed. But none of these deals with nested patterns. For balanced expressions using (, {, [ or < as delimiters, use the CPAN module Regexp::Common, or see "(??{ code })" in perlre. For other cases, you'll have to write a parser.

That said, for your situation, you can repeatedly find the innermost expression and replace it using a dispatch table:
my %arg_xlate = ( func1 => sub { "proc1{$_[0]}" } , func2 => sub { "FUNC $_[0] END" } ); while (<DATA>) { my $line = $_; 0 while ($line =~ s/(func[12])\(([^()]*)\)/$arg_xlate{$1}($2)/ge); print $line; } __DATA__ func1(input1, func2(input2, input3)) func2(func1(input1, input2), input3)

Caution: Contents may have been coded under pressure.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://682246]
[davido]: The code seems pretty sane, and relatively foolproof. I guess I can answer my own question; move() should work across filesystems so long as they're mounted, rw, and not filled up.

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (3)
As of 2016-12-10 03:13 GMT
Find Nodes?
    Voting Booth?
    On a regular basis, I'm most likely to spy upon:

    Results (159 votes). Check out past polls.