If you're conditions are simple enough, turning your structure inside-out will help I think.

my $rules = { 'not in shift' => { allows => [ 'Register for shift', ], }, 'in shift' => { allows => [ 'Confirm in shift', 'Remove from shift', ], }, # 'current' => { # nothing seems to depend on current # }, 'past' => { disallows => [ 'Remove from shift', 'Register for shift', ], }, }; sub get_menu_items { my ($rules,@conditions) = @_; my %results; for my $cond ( @conditions ) { next unless exists $rules->{$cond}; # irrelevant condition for $item ( @{$rules->{$cond}->{allows}} ) { $results{$item}++; } for $item ( @{$rules->{$cond}->{disallows}} ) { delete $results{$item}; } } return keys %results; } my @conditions = ( ['in shift', 'past' ], ['in shift', 'current' ], ['not in shift', 'past' ], ['not in shift', 'current' ], ); for (@conditions) { my @result = get_menu_items($rules,@$_); print "Conditions: " . join(',',@$_) . "\n" . "Menu items: " . join(',',@result) . "\n\n"; }

And the results:

Conditions: in shift,past Menu items: Confirm in shift Conditions: in shift,current Menu items: Remove from shift,Confirm in shift Conditions: not in shift,past Menu items: Conditions: not in shift,current Menu items: Register for shift

This may just be a cheap application of others' suggestions to use boolean algebra and a state machine (or maybe not). I'm just a fan of code examples.

I DO think this is a very natural way for people to express rules in external config files.

--Solo
--
You said you wanted to be around when I made a mistake; well, this could be it, sweetheart.

In reply to Re: Checking lots of conditions...ORed and ANDed by Solo
in thread Checking lots of conditions...ORed and ANDed by TVSET

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.