<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bill Costa</title>
    <description>The latest articles on DEV Community by Bill Costa (@billcosta).</description>
    <link>https://dev.to/billcosta</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F535459%2Fd82e9cca-f288-4eb9-9a72-2f04501cf146.jpeg</url>
      <title>DEV Community: Bill Costa</title>
      <link>https://dev.to/billcosta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/billcosta"/>
    <language>en</language>
    <item>
      <title>Why DDT?</title>
      <dc:creator>Bill Costa</dc:creator>
      <pubDate>Sat, 03 Jul 2021 08:09:16 +0000</pubDate>
      <link>https://dev.to/billcosta/why-ddt-23o8</link>
      <guid>https://dev.to/billcosta/why-ddt-23o8</guid>
      <description>&lt;p&gt;For many years I've been in the habit of naming my debugging flag variable 'DDT'.  It recently occurred to me that many programmers today, looking at my code, would not get the joke.  So why DDT?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Dichlorodiphenyltrichloroethane (DDT) was developed as the first of&lt;br&gt;
the modern synthetic insecticides in the 1940s. It was initially&lt;br&gt;
used with great effect to combat insect pests and became a well&lt;br&gt;
known, and later notorious, insecticide.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From &lt;a href="https://en.wikipedia.org/wiki/Dynamic_debugging_technique"&gt;Wikipedia&lt;/a&gt;:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Dynamic Debugging Technique (DDT) is a series of debugger programs&lt;br&gt;
originally developed for Digital Equipment Corporation (DEC)&lt;br&gt;
hardware, initially known as DEC Debugging Tape because it was&lt;br&gt;
distributed on paper tape.  The name is a pun on the insecticide&lt;br&gt;
DDT.  The first version of DDT was developed at MIT for the PDP-1&lt;br&gt;
computer in 1961, but newer versions on newer platforms continued&lt;br&gt;
to use the same name.  After being ported to other vendor's&lt;br&gt;
platforms and changing media, the name was changed to the less&lt;br&gt;
DEC-centric version.  Early versions of Digital Research's CP/M and&lt;br&gt;
CP/M-86 kept the DEC name DDT (and DDT-86 and DDT-68K) for their&lt;br&gt;
debugger, however, now meaning "Dynamic Debugging Tool".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I used DEC's DDT program briefly in the early 80's on the university's DEC-10 mainframe to debug assembly language programs. So to this day I still like the pun.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PS:&lt;/strong&gt; While I never got to use the original DDT from &lt;a href="https://en.wikipedia.org/wiki/Punched_tape"&gt;paper tape&lt;/a&gt;, I did use paper tape in college (mid-70's) for storing my BASIC language programs.&lt;/p&gt;

&lt;p&gt;Yeah, I'm that old.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PPS:&lt;/strong&gt; DDT is a very effective, if dangerous, insecticide, leading some to observe that the acronym should actually stand for Drop Dead Twice.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>history</category>
      <category>humor</category>
      <category>graybeard</category>
    </item>
    <item>
      <title>Way Too Many IF-THEN-ELSEs?  Try a Lookup Table</title>
      <dc:creator>Bill Costa</dc:creator>
      <pubDate>Sun, 28 Feb 2021 01:33:33 +0000</pubDate>
      <link>https://dev.to/billcosta/way-too-many-if-then-elses-try-a-lookup-table-3j2o</link>
      <guid>https://dev.to/billcosta/way-too-many-if-then-elses-try-a-lookup-table-3j2o</guid>
      <description>&lt;p&gt;This article illustrates a use case where a simple-to-implement lookup table can be used as a better alternative to hard coding decision logic.  The coding trick used here should be applicable to any programming language with multi-dimensional associative arrays.&lt;/p&gt;

&lt;h2&gt;
  
  
  When would you want to do this?
&lt;/h2&gt;

&lt;p&gt;A problem I've faced more than a few times is having a set of variables, perhaps aggregating data from various sources, and needing to determine what overall state, from a limited set of valid states, is being represented by those values.  My first cut at the problem would probably be to draw a decision tree, considering each variable in turn, and then try to implement that tree's logic using nested if-then-else and/or case (switch) statements.  Depending upon the scope and nature of the problem, this could result in a lot of logic that may be hard to follow, debug, or extend.&lt;/p&gt;

&lt;p&gt;One possible alternative is to create a lookup table that enumerates all the expected values for each variable, and to assign the desired state represented by each row of that table.  Creating the table may be a bit tedious, but it can be more easily understood by non-coders, and the logic for doing the lookup can be near trivial.  And perhaps the biggest win is the simplicity in adding, removing, and modifying states by updating the table, rather than hacking on the logic.&lt;/p&gt;

&lt;p&gt;Let's consider a simple example; ordering a car where there are five different trim lines and a set of options.  Not all options are available for all trim lines.  Here's what that might look like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
  &lt;th&gt;Trim
  &lt;/th&gt;
&lt;th&gt;Interior
  &lt;/th&gt;
&lt;th&gt;Wheels
  &lt;/th&gt;
&lt;th&gt;Transmission
  &lt;/th&gt;
&lt;th&gt;Cruise
&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Base&lt;/th&gt;
  &lt;td&gt;cloth&lt;/td&gt;
  &lt;td&gt;steel | alloy&lt;/td&gt;
  &lt;td&gt;manual&lt;/td&gt;
  &lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Premium&lt;/th&gt;
  &lt;td&gt;cloth | leather&lt;/td&gt;
  &lt;td&gt;alloy&lt;/td&gt;
  &lt;td&gt;manual | auto&lt;/td&gt;
  &lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Sport&lt;/th&gt;
  &lt;td&gt;sport-cloth&lt;/td&gt;
  &lt;td&gt;18" black alloy&lt;/td&gt;
  &lt;td&gt;6 speed manual&lt;/td&gt;
  &lt;td&gt;opt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Limited&lt;/th&gt;
  &lt;td&gt;cloth | leather&lt;/td&gt;
  &lt;td&gt;alloy&lt;/td&gt;
  &lt;td&gt;manual | auto&lt;/td&gt;
  &lt;td&gt;std&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Touring&lt;/th&gt;
  &lt;td&gt;leather&lt;/td&gt;
  &lt;td&gt;18" alloy&lt;/td&gt;
  &lt;td&gt;auto&lt;/td&gt;
  &lt;td&gt;std&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We've been tasked to write a function that determines if a set of dealer selected options are allowed for a given trim line, and to identify a valid combination of options and trim as a particular 'bundle' identifier.  Our first step will be to expand the table so that all possible valid combinations are enumerated, and we'll simplify the identifiers a bit.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
  &lt;th&gt;Trim
  &lt;/th&gt;
&lt;th&gt;Interior
  &lt;/th&gt;
&lt;th&gt;Wheels
  &lt;/th&gt;
&lt;th&gt;Transmission
  &lt;/th&gt;
&lt;th&gt;Cruise
  &lt;/th&gt;
&lt;th&gt;Bundle
&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Base&lt;/th&gt;
  &lt;td&gt;cloth&lt;/td&gt;
  &lt;td&gt;steel&lt;/td&gt;
  &lt;td&gt;manual&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
  &lt;td&gt;B1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Base&lt;/th&gt;
  &lt;td&gt;cloth&lt;/td&gt;
  &lt;td&gt;alloy&lt;/td&gt;
  &lt;td&gt;manual&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
  &lt;td&gt;B2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Premium&lt;/th&gt;
  &lt;td&gt;cloth&lt;/td&gt;
  &lt;td&gt;alloy&lt;/td&gt;
  &lt;td&gt;manual&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
  &lt;td&gt;P1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Premium&lt;/th&gt;
  &lt;td&gt;leather&lt;/td&gt;
  &lt;td&gt;alloy&lt;/td&gt;
  &lt;td&gt;manual&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
  &lt;td&gt;P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Premium&lt;/th&gt;
  &lt;td&gt;cloth&lt;/td&gt;
  &lt;td&gt;alloy&lt;/td&gt;
  &lt;td&gt;auto&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
  &lt;td&gt;P3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Premium&lt;/th&gt;
  &lt;td&gt;leather&lt;/td&gt;
  &lt;td&gt;alloy&lt;/td&gt;
  &lt;td&gt;auto&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
  &lt;td&gt;P4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Sport&lt;/th&gt;
  &lt;td&gt;sport&lt;/td&gt;
  &lt;td&gt;sport&lt;/td&gt;
  &lt;td&gt;sport&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
  &lt;td&gt;S1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Sport&lt;/th&gt;
  &lt;td&gt;sport&lt;/td&gt;
  &lt;td&gt;sport&lt;/td&gt;
  &lt;td&gt;sport&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;S2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Limited&lt;/th&gt;
  &lt;td&gt;cloth&lt;/td&gt;
  &lt;td&gt;alloy&lt;/td&gt;
  &lt;td&gt;manual&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;L1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Limited&lt;/th&gt;
  &lt;td&gt;leather&lt;/td&gt;
  &lt;td&gt;alloy&lt;/td&gt;
  &lt;td&gt;manual&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;L2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Limited&lt;/th&gt;
  &lt;td&gt;cloth&lt;/td&gt;
  &lt;td&gt;alloy&lt;/td&gt;
  &lt;td&gt;auto&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;L3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Limited&lt;/th&gt;
  &lt;td&gt;leather&lt;/td&gt;
  &lt;td&gt;alloy&lt;/td&gt;
  &lt;td&gt;auto&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;L4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;th&gt;Touring&lt;/th&gt;
  &lt;td&gt;leather&lt;/td&gt;
  &lt;td&gt;touring&lt;/td&gt;
  &lt;td&gt;auto&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;T1&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When we are convinced that we have enumerated all of the valid possible combinations, we can turn this table into a multi-dimensional hash.  The resulting Perl code, shown below, bears an uncanny resemblance to our table.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nv"&gt;%bundle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;#       Trim      Interior  Wheels    Trannie  Cruise Bundle&lt;/span&gt;
&lt;span class="c1"&gt;#       --------- --------- --------- -------- ------ ------&lt;/span&gt;
&lt;span class="nv"&gt;$bundle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;cloth&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;steel&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;manual&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;B1&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$bundle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;cloth&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;alloy&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;manual&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;B2&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$bundle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;premium&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;cloth&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;alloy&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;manual&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;P1&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$bundle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;premium&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;leather&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;alloy&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;manual&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;P2&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$bundle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;premium&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;cloth&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;alloy&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;P3&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$bundle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;premium&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;leather&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;alloy&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;P4&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$bundle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;sport&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;sport&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;sport&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;sport&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;S1&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$bundle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;sport&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;sport&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;sport&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;sport&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;S2&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$bundle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;limited&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;cloth&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;alloy&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;manual&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$bundle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;limited&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;leather&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;alloy&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;manual&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$bundle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;limited&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;cloth&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;alloy&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$bundle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;limited&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;leather&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;alloy&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$bundle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;touring&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;leather&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;touring&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now to determine if we have been given a valid combination of trim and options, and to return the bundle code, we just do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nv"&gt;$trim&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;touring&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$seats&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;leather&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$wheels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;touring&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$trans&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;$cruise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$bCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$bundle&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$trim&lt;/span&gt;&lt;span class="p"&gt;}{&lt;/span&gt;&lt;span class="nv"&gt;$seats&lt;/span&gt;&lt;span class="p"&gt;}{&lt;/span&gt;&lt;span class="nv"&gt;$wheels&lt;/span&gt;&lt;span class="p"&gt;}{&lt;/span&gt;&lt;span class="nv"&gt;$trans&lt;/span&gt;&lt;span class="p"&gt;}{&lt;/span&gt;&lt;span class="nv"&gt;$cruise&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;$bCode&lt;/code&gt; is defined, then we know the combination is valid and we have our bundle code (&lt;code&gt;T1&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Notice how adding a new trim line or a new option is just a matter of modifying the table with little or no change to the lookup statement.  In contrast, a block of if-then-elsif statements might not be so easy to hack and debug.&lt;/p&gt;

&lt;p&gt;An interactive command-line demo script, which also includes error handling and validation, can be &lt;a href="https://gist.github.com/Bill-Costa/314d6162bb623675de17a575802af441"&gt;found here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>perl</category>
      <category>tutorial</category>
      <category>algorithms</category>
    </item>
  </channel>
</rss>
