#!/usr/bin/perl -wd use strict; print doFunc( "MAIN", "B(1)+C(2)" ); sub doFunc{ my ($theFunc, $rem) = @_; my $re = &get_re($rem); if( $rem ne $re ) { $rem =~ s/(\w+)\(($re)\)/doFunc($1,$2)/eg; } return "func $theFunc rets $rem"; } ## ## When we're called with the initial ## state, return "1|2". Otherwise, return ## our input, quotemeta'd. ## sub get_re { my ($in) = @_; if ($in eq "B(1)+C(2)") { return '1|2'; } else { return quotemeta($in); } } #### print doFunc( "MAIN", "B(1)+C(2)" ); sub doFunc{ my $theFunc = shift; local $_ = shift; my $re; $re = ${{ "B(1)+C(2)" => '1|2', }}{$_}||quotemeta; print "$theFunc: '$_'=~/$re/\n"; print join"\n",/(\w+)\(($re)\)/g,"\n"; if( $_ ne $re ) { $_ =~ s/(\w+)\(($re)\)/&doFunc($1,$2)/eg; # /ego works /eg fails } return "func $theFunc returns <$_>"; }