in reply to best way to inline code? (i.e. macro)

Try using eval to compile the calling subs, e.g.
BEGIN { $short = '{ do_stuff ... }'; eval 'sub big { $something; '.$short.' $other_thing }'; }
You have to be careful, but it's not that bad if you use single quotes and concatenation.

Replies are listed 'Best First'.
Re^2: best way to inline code? (i.e. macro)
by VSarkiss (Monsignor) on Oct 17, 2005 at 21:38 UTC
      You already have an interpreter instance if you are running code under mod_perl. String eval under mod_perl does have the same downsides that it does in any other perl code though.
        Nice to see a familiar mod_perl'er on the PM site :) (Hi Perrin).

        FWIW, the code in question is a DB_Connect sub that calls Apache::DBI's DBI->connect. So I've got lots of select/udpate subroutines, and they each call the DB_Connect sub at the beginning to get a database handle. I'd consider just making the $dbh a global var, but then I'd lose the implicit Apache::DBI ping/reconnect.
        sub DB_connect { return DBI->connect( $Const::DB_Name, $Const::DB_User, $Const::DB_Pass, { PrintError => 1, RaiseError => 1, AutoCommit => 1 } ) || die "DATABASE CONNECTION ERROR: " . $DBI::errstr . "\n"; }
        Anyways, running DProf shows that the frequent DB_Connect calls are sucking extra CPU cycles, so I thought (if there was an easy way to try it) I'd just inline my DBI->connect subroutine. I know, you're saying "that's not the problem" or "that's a fishing expedition", etc. Very possible... and that's why I was hoping there was a very easy way to test inlining the sub.

        I'm not crazy about the notion of using eval '', particularly since it looks like from the first suggestion given that I have to eval all of my calling subs, which is alot. Really, ideally, I think even a C-style preparser #define would do the trick.... if one existed in Perl...

        MFN