http://qs321.pair.com?node_id=276880


in reply to Shorten script

You could also use something along the lines of a dispatch table.
my %match = ( 'pattern_one' => 1, 'pattern_two' => 1, ); while (<F>) { next unless ( m/(match_pattern)/ ); print "PAGE ->\t$name\ndata ->"; print $match{$1} ? "\t\t$1\nMatched ->\t$hit\n" : " TEXT INFO HERE\n"; push(@files, $name); $ct++; } close(F);

In this case the %match is a little useless, as your blocks aren't really doing anything all that different aside from what to print. You are also using variables in the block that aren't being created in the block so its difficult to grasp exactly what you are trying to shorten. In a more complex case, the value of $match{pattern} could be a code ref, or any other data structure which could shorten the main loop a touch.. Something like

my %match = ( 'pattern_one' => [\&sub_one, $results_one], 'pattern_two' => [\&sub_two, $results_two], ); while (<F>) { chomp; next unless ( m/(match_pattern)/ ); unless ( $match{$1} ) { #something basic goes here next; } # get the right function from our dispatch table ($func, $results) = [ $match{$1} ]; # now call it, pass it the text to process, and store the # results. $results = &$func($1); } # END while <F> close(F);

In my own code, I tend to either make $results either an array or hash reference, depending on the situation, and the call may be altered to be say push(@$results, &$func($1)); or some such.

HTH, regards

use perl;