2 <html lang="en-us" itemscope itemtype="http://schema.org/Article">
5 <meta name="description" content="A little bit about Perl Style By and large I feel that massively indented and thus multi level conditional statements are not handled well by most people. You see as your evaluating the code you have to "put on the...">
6 <meta name="generator" content="Movable Type 5.2.3">
7 <title>Perl Style - Status</title>
8 <link rel="alternate" type="application/atom+xml" title="Recent Entries" href="http://defaria.com/blogs/Status/atom.xml">
9 <link rel="canonical" href="http://defaria.com/blogs/Status/2006/11/perl-style.html">
10 <meta name="viewport" content="width=device-width,initial-scale=1">
11 <link rel="stylesheet" href="http://defaria.com/blogs/Status/styles.css">
13 <link rel="stylesheet" href="http://defaria.com/blogs/Status/styles_ie.css">
14 <script src="/mt/mt-static/support/theme_static/rainier/js/html5shiv.js"></script>
17 <link rel="start" href="http://defaria.com/blogs/Status/">
19 <link rel="prev" href="http://defaria.com/blogs/Status/2006/11/more-gpdb-fixes.html" title="More GPDB fixes">
20 <link rel="next" href="http://defaria.com/blogs/Status/2006/12/gpdb-bug-fixed.html" title="GPDB Bug Fixed">
21 <!-- Open Graph Protocol -->
22 <meta property="og:type" content="article">
23 <meta property="og:locale" content="en-us">
24 <meta property="og:title" content="Perl Style">
25 <meta property="og:url" content="http://defaria.com/blogs/Status/2006/11/perl-style.html">
26 <meta property="og:description" content="A little bit about Perl Style By and large I feel that massively indented and thus multi level conditional statements are not handled well by most people. You see as your evaluating the code you have to "put on the...">
27 <meta property="og:site_name" content="Status">
28 <meta property="og:image" content="/mt/mt-static/support/theme_static/rainier/img/siteicon-sample.png">
30 <meta itemprop="description" content="A little bit about Perl Style By and large I feel that massively indented and thus multi level conditional statements are not handled well by most people. You see as your evaluating the code you have to "put on the...">
31 <link itemprop="url" href="http://defaria.com/blogs/Status/2006/11/perl-style.html">
32 <link itemprop="image" href="/mt/mt-static/support/theme_static/rainier/img/siteicon-sample.png">
37 <div id="container-inner">
38 <header id="header" role="banner">
39 <div id="header-inner">
40 <div id="header-content">
42 <a href="http://defaria.com/blogs/Status/">
51 <nav role="navigation">
53 <li><a href="http://defaria.com/blogs/Status/">Home</a></li>
62 <div id="content-inner">
63 <ul class="breadcrumb breadcrumb-list">
64 <li class="breadcrumb-list-item"><a href="http://defaria.com/blogs/Status/">Home</a></li>
65 <li class="breadcrumb-list-item">Perl Style</li>
67 <div id="individual-main" class="main" role="main">
68 <article id="entry-1855" class="entry entry-asset asset hentry">
69 <div class="asset-header">
70 <h2 itemprop="name" class="asset-name entry-title">Perl Style</h2>
71 <footer class="asset-meta">
72 <ul class="asset-meta-list">
73 <li class="asset-meta-list-item">Posted on <time datetime="2006-11-29T06:38:44-08:00" itemprop="datePublished">November 29, 2006</time></li>
74 <li class="asset-meta-list-item">by <span class="author entry-author vcard"></span></li>
77 <li class="asset-meta-list-item">in <a itemprop="articleSection" rel="tag" href="http://defaria.com/blogs/Status/texas-instruments/">Texas Instruments</a></li>
83 <div class="entry-content asset-content" itemprop="articleBody">
84 <h2>A little bit about Perl Style</h2>
86 <p>By and large I feel that massively indented and thus multi level conditional statements are not handled well by most people. You see as your evaluating the code you have to "put on the mind stack" each condition and bear it in mind as you successively consider each of the nestings of code. As such I always "look for ways out" of the script/function/routine that I'm in. The idea is to avoid nesting by handling error conditions and other "if this happens then we're done" first, often die'ing, erroring out, returning the script/function or subroutine. The net effect is that the rest of the code, the code that normally executes, is shifted to the left a level or two. Additionally complicated, repeated or complex code can be written into a well named subroutine and called from the main or other functions when needed. To me this all makes the code a lot easier to read.</p>
88 <p>As an example, and again, I'm not trying to pick on your script specifically and I realize that this might not be the final version, but in reality it contains only a call to GetOptions and 2 if statements. The first if statement merely calls usage if -h is specified. BTW this could be re-written as:</p>
104 <p>IOW rather than define an $h variable and then set it via GetOptions then test it afterwards only to call usage, define an anonymous subroutine can calls usage directly from GetOptions. Or, since anything other than the stated options displays usage (as per the "|| usage") simply drop the "h" line entirely. If the user specifies -h then it's unknown and usage is displayed. Then $h can be removed as well as the if test following GetOptions.</p>
106 <p>The next if statement tests that all of the above variables have been defined. If so then all real processing happens inside that if (and other nested if's therein). Otherwise usage is called. In following with the "looking for a reason to get out" philosophy how about:</p>
108 <div class=code><pre>
110 defined $password &&
111 defined $XAID &&
112 defined $projName &&
113 defined $serverName &&
114 defined $unixGroup &&
115 defined $cachePath &&
116 defined $port &&
121 <p>Basically this says, "if any of these are not defined call usage" and since usage doesn't return everything inside the old if statement can be shifted to the left. Other opportunities exist to continue to apply this philosophy of "getting out while you can" and reducing the nesting level of the program. For example, inside the old if statement you
122 check to see if the login of GPDB successfully made you an administrator. If not you're gonna stop the script right there. So then how about something like:</p>
124 <div class=code><pre>
125 my $login = gpdb_login ($XAID, $password);
127 error "$XAID is not an administrator", 1 if $login !~ /administrator/;
130 <p>gpdb_login returns a string that will contain "administrator" if you were able to login as an administrator. Here I use error, a routine that I often use (in fact I'd like to publish it to TI as a common utility) that writes an error message to STDERR and optionally exits if
131 the second parameter is not 0.</p>
134 <nav class="page-navigation entry-navigation pagination content-nav">
135 <ul class="page-navigation-list">
137 <li class="page-navigation-list-item page-navigation-prev"><a rel="prev" href="http://defaria.com/blogs/Status/2006/11/more-gpdb-fixes.html" title="More GPDB fixes">Previous entry</a></li>
140 <li class="page-navigation-list-item page-navigation-next"><a rel="next" href="http://defaria.com/blogs/Status/2006/12/gpdb-bug-fixed.html" title="GPDB Bug Fixed">Next entry</a></li>
145 <aside id="zenback" class="zenback feedback">
146 Please paste Zenback script code here.
153 <aside class="widgets related" role="complementary">
154 <nav class="widget-search widget">
155 <div class="widget-content">
156 <form method="get" id="search" action="http://defaria.com/mt/mt-search.cgi">
158 <input type="text" name="search" value="" placeholder="Search...">
160 <input type="hidden" name="IncludeBlogs" value="8">
162 <input type="hidden" name="limit" value="20">
163 <button type="submit" name="button">
164 <img alt="Search" src="/mt/mt-static/support/theme_static/rainier/img/search-icon.png">
170 <nav class="widget-archive-category widget">
171 <h3 class="widget-header">Categories</h3>
172 <div class="widget-content">
175 <ul class="widget-list">
178 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/ameriquest/">Ameriquest (99)</a>
186 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/audience/">Audience (3)</a>
194 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/broadcom/">Broadcom (76)</a>
202 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/gpdb/">GPDB (35)</a>
210 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/general-dynamics/">General Dynamics (61)</a>
218 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/general-electric/">General Electric (13)</a>
226 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/hewlett-packard/">Hewlett Packard (13)</a>
234 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/lynuxworks/">LynuxWorks (162)</a>
242 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/pqa/">PQA (35)</a>
250 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/salira/">Salira (79)</a>
258 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/tellabs/">Tellabs (2)</a>
266 <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/texas-instruments/">Texas Instruments (31)</a>
278 <nav class="widget-archive-dropdown widget">
279 <h3 class="widget-header">Archives</h3>
280 <div class="widget-content">
282 <option>Select a Month...</option>
284 <option value="http://defaria.com/blogs/Status/2016/02/">February 2016</option>
288 <option value="http://defaria.com/blogs/Status/2014/09/">September 2014</option>
292 <option value="http://defaria.com/blogs/Status/2014/04/">April 2014</option>
296 <option value="http://defaria.com/blogs/Status/2014/03/">March 2014</option>
300 <option value="http://defaria.com/blogs/Status/2013/02/">February 2013</option>
304 <option value="http://defaria.com/blogs/Status/2012/09/">September 2012</option>
308 <option value="http://defaria.com/blogs/Status/2012/08/">August 2012</option>
312 <option value="http://defaria.com/blogs/Status/2012/05/">May 2012</option>
316 <option value="http://defaria.com/blogs/Status/2012/04/">April 2012</option>
320 <option value="http://defaria.com/blogs/Status/2012/02/">February 2012</option>
324 <option value="http://defaria.com/blogs/Status/2012/01/">January 2012</option>
328 <option value="http://defaria.com/blogs/Status/2011/10/">October 2011</option>
332 <option value="http://defaria.com/blogs/Status/2011/07/">July 2011</option>
336 <option value="http://defaria.com/blogs/Status/2010/09/">September 2010</option>
340 <option value="http://defaria.com/blogs/Status/2010/08/">August 2010</option>
344 <option value="http://defaria.com/blogs/Status/2010/04/">April 2010</option>
348 <option value="http://defaria.com/blogs/Status/2010/03/">March 2010</option>
352 <option value="http://defaria.com/blogs/Status/2010/02/">February 2010</option>
356 <option value="http://defaria.com/blogs/Status/2009/05/">May 2009</option>
360 <option value="http://defaria.com/blogs/Status/2009/04/">April 2009</option>
364 <option value="http://defaria.com/blogs/Status/2008/07/">July 2008</option>
368 <option value="http://defaria.com/blogs/Status/2008/05/">May 2008</option>
372 <option value="http://defaria.com/blogs/Status/2008/04/">April 2008</option>
376 <option value="http://defaria.com/blogs/Status/2008/03/">March 2008</option>
380 <option value="http://defaria.com/blogs/Status/2008/02/">February 2008</option>
384 <option value="http://defaria.com/blogs/Status/2008/01/">January 2008</option>
388 <option value="http://defaria.com/blogs/Status/2007/12/">December 2007</option>
392 <option value="http://defaria.com/blogs/Status/2007/11/">November 2007</option>
396 <option value="http://defaria.com/blogs/Status/2007/10/">October 2007</option>
400 <option value="http://defaria.com/blogs/Status/2007/09/">September 2007</option>
404 <option value="http://defaria.com/blogs/Status/2007/08/">August 2007</option>
408 <option value="http://defaria.com/blogs/Status/2007/07/">July 2007</option>
412 <option value="http://defaria.com/blogs/Status/2007/06/">June 2007</option>
416 <option value="http://defaria.com/blogs/Status/2007/05/">May 2007</option>
420 <option value="http://defaria.com/blogs/Status/2007/04/">April 2007</option>
424 <option value="http://defaria.com/blogs/Status/2007/03/">March 2007</option>
428 <option value="http://defaria.com/blogs/Status/2007/01/">January 2007</option>
432 <option value="http://defaria.com/blogs/Status/2006/12/">December 2006</option>
436 <option value="http://defaria.com/blogs/Status/2006/11/">November 2006</option>
440 <option value="http://defaria.com/blogs/Status/2006/10/">October 2006</option>
444 <option value="http://defaria.com/blogs/Status/2006/09/">September 2006</option>
448 <option value="http://defaria.com/blogs/Status/2006/07/">July 2006</option>
452 <option value="http://defaria.com/blogs/Status/2006/06/">June 2006</option>
456 <option value="http://defaria.com/blogs/Status/2006/05/">May 2006</option>
460 <option value="http://defaria.com/blogs/Status/2006/04/">April 2006</option>
464 <option value="http://defaria.com/blogs/Status/2006/03/">March 2006</option>
468 <option value="http://defaria.com/blogs/Status/2006/02/">February 2006</option>
472 <option value="http://defaria.com/blogs/Status/2006/01/">January 2006</option>
476 <option value="http://defaria.com/blogs/Status/2005/12/">December 2005</option>
480 <option value="http://defaria.com/blogs/Status/2005/11/">November 2005</option>
484 <option value="http://defaria.com/blogs/Status/2005/10/">October 2005</option>
488 <option value="http://defaria.com/blogs/Status/2005/09/">September 2005</option>
492 <option value="http://defaria.com/blogs/Status/2005/08/">August 2005</option>
496 <option value="http://defaria.com/blogs/Status/2005/07/">July 2005</option>
500 <option value="http://defaria.com/blogs/Status/2005/06/">June 2005</option>
504 <option value="http://defaria.com/blogs/Status/2005/05/">May 2005</option>
508 <option value="http://defaria.com/blogs/Status/2005/04/">April 2005</option>
512 <option value="http://defaria.com/blogs/Status/2005/03/">March 2005</option>
516 <option value="http://defaria.com/blogs/Status/2005/02/">February 2005</option>
520 <option value="http://defaria.com/blogs/Status/2005/01/">January 2005</option>
524 <option value="http://defaria.com/blogs/Status/2004/12/">December 2004</option>
528 <option value="http://defaria.com/blogs/Status/2004/09/">September 2004</option>
532 <option value="http://defaria.com/blogs/Status/2004/08/">August 2004</option>
536 <option value="http://defaria.com/blogs/Status/2004/07/">July 2004</option>
540 <option value="http://defaria.com/blogs/Status/2004/06/">June 2004</option>
544 <option value="http://defaria.com/blogs/Status/2004/05/">May 2004</option>
548 <option value="http://defaria.com/blogs/Status/2004/04/">April 2004</option>
552 <option value="http://defaria.com/blogs/Status/2004/03/">March 2004</option>
556 <option value="http://defaria.com/blogs/Status/2004/02/">February 2004</option>
560 <option value="http://defaria.com/blogs/Status/2004/01/">January 2004</option>
564 <option value="http://defaria.com/blogs/Status/2003/12/">December 2003</option>
568 <option value="http://defaria.com/blogs/Status/2003/11/">November 2003</option>
576 <div class="widget-syndication widget section">
577 <div class="widget-content">
578 <p><img src="http://defaria.com/mt/mt-static/images/status_icons/feed.gif" alt="Subscribe to feed" width="9" height="9" /> <a href="http://defaria.com/blogs/Status/atom.xml">Subscribe to this blog's feed</a></p>
586 <footer id="footer" role="contentinfo">
587 <div id="footer-inner">
588 <div id="footer-content">
589 <nav role="navigation">
591 <li><a href="http://defaria.com/blogs/Status/">Home</a></li>
597 <p class="license">© Copyright 2016.</p>
598 <p class="poweredby">Powered by <a href="http://www.movabletype.org/">Movable Type</a></p>
604 <script src="http://defaria.com/mt/mt-static/jquery/jquery.min.js"></script>
605 <script src="http://defaria.com/blogs/Status/mt-theme-scale2.js"></script>