in reply to recursive /eg fails
I0,
You have no base clase case for your recursion. When
you get down to the bottom call, you try to execute
"func xxx returns y". Try this (tip to stephen for cleaning
it up):
#!/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); } }
-derby
update: There's a base case and a base class (no relation) but base clase?
update: Just spent a few minutes with your original. Here's it is with the base case added:
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 <$_>"; }
|
---|
In Section
Seekers of Perl Wisdom