http://www.perlmonks.org?node_id=568613


in reply to Avoiding if/else knots

I recently had to tackle something similar (yet different) in my work. I had half a dozen conditions to check and various combinations resulted in counting items in different ways. I knew that there had to be a better way than having a page of if/elsif/else (actually, it was a nested ternary, but it functioned the same).

After spending a while thinking about it (load the problem into memory; take it home; let it run in the background) I saw that at the heart of the problem I was filtering things. I don't know if that's quite the same for you (not enough details in the OP). I essentially had a request that was looking for things that had a certain set of attributes. I was comparing the attributes of the request to the attributes of each item in the list to find matches and count matches / misses accordingly. I worked up a solution that defined a record filter by setting up a bit mask indicating which attributes I was looking for. Then as I looked at each record that I needed to filter, I set bit flags according to the attributes of the record. Then a bit-wise & told me if I got a match.

Assuming that this even comes close to resembling your problem, you could use the discrete bit-wise results as keys in you dispatch table. The values would be the methods to dispatch to for each case.

Ivan Heffner
Sr. Software Engineer, DAS Lead
WhitePages.com, Inc.