in reply to improve ugly flow control
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
|
---|