Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic

Re: Shorten script

by l2kashe (Deacon)
on Jul 22, 2003 at 19:07 UTC ( #276880=note: print w/replies, xml ) Need Help??

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;

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://276880]
and the monks are chillaxin'...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (4)
As of 2017-06-29 07:31 GMT
Find Nodes?
    Voting Booth?
    How many monitors do you use while coding?

    Results (654 votes). Check out past polls.