in reply to performance - loops, sub refs, symbol tables, and if/elses

I'd try the Symbol Table Fiddle approach, but only do one function that way, e.g.
if ( $type eq 'apple' ) { *func = sub { &apple_wash; &apple_core; &apple_pulp; }; }
Then I'd use the statement-modifier form of "for", which avoids setting up a lexical block:
&func for @items;
(Pass the item in $_ instead of in an explicit variable.)

jdporter
...porque es dificil estar guapo y blanco.

Replies are listed 'Best First'.
Re: Re: performance - loops, sub refs, symbol tables, and if/elses
by djantzen (Priest) on Dec 17, 2002 at 16:57 UTC

    I'm confused. You want create a new function every time you encounter an object of type 'apple'? Also, it seems the subroutines for each object take a parameter (unless you mean to use & to preserve @_, but he said it should be maintainable ;^) so the new sub would have to be:

    *apple_proc = sub { my $item = shift; apple_wash($item); apple_core($item); apple_pulp($item); }; # same for bananas here.

    I don't think you can avoid the lexical block here since we still need to test for the type of object before executing the appropriate subroutine:

    foreach my $item (@items) { SWITCH: for ($type) { # not sure from the writeup where # $type is supposed to come from /apple/ && do { apple_proc($item); }; /banana/ && do { banana_proc($item); }; warn "Unknown thingy: $type\n"; # Default case } }