Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW

Re: improve ugly flow control

by dragonchild (Archbishop)
on Sep 19, 2004 at 14:12 UTC ( #392185=note: print w/replies, xml ) Need Help??

in reply to improve ugly flow control

If something feels redundant, that's probably a good reason to look at putting it in a subroutine. I would do something like this:
sub handle_options { my ($hash, $options, $subref) = @_; foreach my $try (@$options) { next unless exists $hash->{$try}; $subref->( $try ); return; } die; } eval { handle_options( \%hash, \@options, \&do_something ); }; if {$@) { log_failure(); }

(Yes, I am really returning undef and die'ing with no string. The key is die/not-die, determining whether or not to trigger the if ($@) { ... } block.)

The really neat thing about this method is that you can handle multiple sets of options in the same eval, so long as they all use the same algorithm.

eval { handle_options( \%hash1, \@options1, \&do_something1 ); handle_options( \%hash2, \@options2, \&do_something2 ); handle_options( \%hash3, \@options3, \&do_something3 ); }; if ($@) { log_failure(); }

Note: This will do_something1() for the first set before handling the second set, and so forth. The description you give implies that this should be the case, but it's explicit here.

We are the carpenters and bricklayers of the Information Age.

Then there are Damian modules.... *sigh* ... that's not about being less-lazy -- that's about being on some really good drugs -- you know, there is no spoon. - flyingmoose

I shouldn't have to say this, but any code, unless otherwise stated, is untested

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://392185]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (3)
As of 2018-01-21 01:54 GMT
Find Nodes?
    Voting Booth?
    How did you see in the new year?

    Results (227 votes). Check out past polls.