Slashdot Mirror


Perl Medic

Craig Maloney writes "Anyone who codes in Perl can relate to working on other people's code. Sometimes the code will thankfully include "use warnings" and be a joy to maintain. More likely, though, the code will have so many warnings that the useful output is long gone in the stratosphere of your scroll buffer. Even good code written for earlier versions of Perl can become aged and decrepit, requiring elderly modules that may or may not work with newer versions of Perl. Maintaining this code can be a hassle, but fortunately Perl Medic: Transforming Legacy Code (referred to for the duration of the review as Perl Medic) provides some very useful tips for getting through these migrations, and will help the next person maintaining your code." Read on for the rest of Maloney's review. Perl Medic author Peter J. Scott pages 312 publisher Addison Wesley rating 8 reviewer Craig Maloney ISBN 0201795264 summary A great collection of Perl wisdom and tips for experts and other patient Perl acolytes.

One of the goals of Perl Medic is to transform code from stylistically poor and unmaintainable into stylistically sound, maintainable and testable code. The format of Perl Medic is very similar to books like The Pragmatic Programmer or The Practice of Programming. Perl Medic shows the reader best practices by example. Some of the chapters are checklists of practices that will help improve your ability to manage and wrangle the code, while others are lists of patterns and practices you should avoid, and should replace with the examples provided. This format very readable, and provides an excellent forum for gleaning what ways to improve the code.

Perl Medic is designed with experienced coders in mind. Topics are presented as if the reader may be using these ideas already in their code, whether good or not. While the advice is good, the presentation may be confusing for beginner and intermediate programmers who aren't intimately familiar with the concepts. I found myself re-reading several topics to try and grasp what the author was trying to convey. After several readings of the section on test harnesses, I still needed help, and ran to the Perl documentation to better understand what the author was saying. Certain advice is also presented, only to have it countered in the next section. Most Perl programmers are familiar with the '-w' switch, which turns on warnings in a Perl program. The pragma 'use warnings' is introduced as a way to turn on warnings for just the code being worked on without displaying the warnings of the modules included in the program. In the next section, the author points out that it might be a good idea to put '-w' in there to see if there are any issues in the modules you may be including. While this advice may be intuitive for experienced Perl coders, the beginner may be confused. "Should I use '-w', or should I use 'use warnings'" she may ask herself.

The book also suffers from a case of being too brief in some sections. In section 2.3.1 (Gobbledygook) the reader is directed for help on how to turn a partially obfuscated program into more intelligible code; a very useful skill indeed. The author redirects the reader to section 4.5 where the utility perltidy is discussed with further detail, but before ending the section, the author also introduces the module 'B::Deobfuscate' along with a URL. No mention of how to use it is provided. In section 6.4 (Debugging Strategies) the author gives advice on how to debug a program. His advice: "Divide and Conquer". While there is debugging advice throughout the book, it's a little frustrating to see a section specifically designated "Debugging", with only one subheading under it. The organization of some of the topics feels artificial, and perhaps should be reorganized in future editions.

Underneath these faults, though, Perl Medic is a great book. Chapter 11 (A Case Study) should be required reading for coders inheriting Perl projects. This chapter is a blow-by-blow account of the author's work in transforming a simple LDAP application from Perl 4 into a robust Perl 5.8 application. The author is very candid about what decisions were made in the code transformation, and why certain elements were addressed in the way they were addressed. One particular element is an elderly module used for the LDAP lookups themselves. The author details the process used to determine a better module to replace this module, and guides the reader through each of the steps required to change the code to use this new module. The decisions the author uses to make this code work under the new environment are enlightening for anyone planning a migration of Perl code into a newer environment. Chapter 7 contains the versions of Perl from Perl 4 up until 5.8.3, and elaborates on what changed between the versions (very helpful for those who are planning an upgrade from 5.003 to a more recent version of Perl). Chapter 9 (Analysis) has very useful tips for not only debugging you program, but for using the Perl Debugger and getting the most out of your debugging session.

Perl Medic is recommended for anyone who is tasked with maintaining or writing Perl Code. While the examples are written with experienced coders in mind, beginners will do well to use this book for areas to focus on while they learn the language. Inheriting code can be a daunting task, but with a book like Perl Medic, you'll have the tools at hand to help ease the work ahead into a more manageable task. And you'll make it easier for "the next guy".

You can purchase Perl Medic: Transforming Legacy Code from bn.com. Slashdot welcomes readers' book reviews -- to see your own review here, read the book review guidelines, then visit the submission page.

28 of 194 comments (clear)

  1. The thing about Perl... by Sheetrock · · Score: 3, Insightful
    While its ubiquitiousness and relative ease of use as far as banging together a CGI script in an hour goes, it does not seem designed for maintainability.

    Preventative and maintainance coding is difficult enough when a language has a particular idiom you can follow. Perl gives you an unparallelled freedom of expression and with it several confusingly different ways to achieve the same task.

    I used to be a believer, but now it seems Python is ready to take the yoke, at least with those of us who wonder how can you build a complex yet maintainable script without static typing.

    --

    Try not. Do or do not, there is no try.
    -- Dr. Spock, stardate 2822-3.




  2. Re:Nay by jargoone · · Score: 3, Informative

    Yeah. Because PHP is great at non-web applications.

  3. Comments to come: blah, Perl hard to read/maintain by Neil+Blender · · Score: 4, Funny

    s/shitty perl code/shitty code in any language/;

    You can inherit shit in any language.

  4. not just for legacy code by consumer · · Score: 5, Informative

    This is the best book I've ever read about how to write clear and maintainable Perl code. The advice is solid and up-to-date with discussions of perltidy, modern web techniques, etc. I would recommend this book to anyone who writes Perl, just as a style guide.

    1. Re:not just for legacy code by Hercynium · · Score: 3, Informative

      Hear, hear! I have had this book in my desktop library since i bought it eight months ago. While it's certainly too short to truly cover the topic completely, this book has remarkable depth, and is still quite easy to grok. You can read it cover-to-cover or flip around and always find some useful advice. Don't make the mistake of thinking this book is too short to be useful... It's filled with hints and links to more information. Heck, nowadays, all books should be filled with links and references; printed materials too often become obsolete too quickly!

      (Normally I'm a grammar/spelling nazi for myself... but I've been coding in PHP all day and I've lost the will to fight for correctness.)

      --
      I'm done with sigs. Sigs are lame.
  5. Using a new language is usually not an option by winkydink · · Score: 5, Insightful

    In most cases, refreshing an existing program will take less time than rewriting it in a diffferent language, as in both cases you need to have a firm understanding of what the program does before proceeding.

    In many corporate cases, you don't have the luxury of writing in any language you please and, even if you do, in most cases you'll have an uphill challenge convincing a PHB that rewriting from scratch in a new language is the better proposition.

    --

    "I'd rather be a lightning rod than a seismometer." -Ken Kesey

  6. No problem. by jspoon · · Score: 5, Funny
    More likely, though, the code will have so many warnings that the useful output is long gone in the stratosphere of your scroll buffer.

    When this happens, just write a Perl script to sort out the parts you need to know and print out a nice little summary.

  7. Re:Nay by Shin+Chan · · Score: 2, Interesting

    PHP?! PHP?!?!

    Okay. Sure. PHP does give some advantages over Perl.. To lazy programmers that is. Really, PHP has over 3125 core functions, while Perl has "only" some 150. Include a module and whoop, some more functionallity, including only those things you need.

    Really, how often do you have to look up a PHP function's working (or even name, hence PHP isn't very consistant, something2something, something_to_something, somethingtosomething... the list goes on)? When I haven't worked with PHP for a while that starts to faint. Perl never does.

    Oh and, rewriting a map{} and grep{} is left as an exercise to the reader ;)

    --
    Proud owner of BOT2K3 [ bot2k3.net ]
  8. Maintainability of Perl code? by Sv-Manowar · · Score: 3, Insightful

    Cue the flood of 'Perl is hard to maintain/read' and counterflood of 'You can write hard to maintain/read code in any language' posts.

    I think it can be generally agreed that due to the TMTOWTDI philosophy behind Perl, there can be complications involved when inheriting code from others who use a different style and different approach. (Obviously due to the many ways any given task can be approached).

    One (common?) approach to dealing with this seems to be to use different languages such as Python or Ruby. Arguably, however, if more coders stuck to code style guidelines and used best practices instead of quick hacks, the problem would be minimal, or at least no worse than other scripting languages.

    1. Re:Maintainability of Perl code? by snorklewacker · · Score: 2, Interesting

      Not going to intersperse your points with mine, since I really hate that style, so I'll just go in order.

      1. No one will argue against perl having too much punctuation. It's a hell of a noisy language, and you can really play some perl golf with sigils if you try. Sometimes you even have to, but rarely.

      2. The "magic" also makes things easier to read. "open $file or die" anyone? Sure beats checking whether it returns nonzero, don't it?

      3. Then use one of the Class:: modules. Personally, I rather LIKE that I can have a subclass with a polymorphic constructor, which you can't really get with languages that hardwire the constructor. What the hell is a class factory? Don't need that idiom in perl.

      4. It only becomes insane when you start dealing with prototypes and @foo is suddenly an array and not a list. Otherwise this is idiom that anyone can get used to. Frankly, I find it a nitpick -- you want really shitty data models, pick on the insane "scalar" thing, where the string "0" is false in an if statement.

      5. This is actually just false. You use BEGIN for compile-time stuff and an import method for import-time semantics. Hard, eh?

      Perl 5 is over 10 years old, and showing its age in various ways, but it can still take criticism and even a lot of kicking gracefully. It's the language everyone loves to hate, but when rubber meets the road, it's what you find people using anyway. It's an inelegant crock, it's shell, sed, and awk duck-taped together, but it's exactly what people asked for.

      Spare me the bondage of enforced "elegance". If you want Java, you know where to find it.

      --
      I am no longer wasting my time with slashdot
    2. Re:Maintainability of Perl code? by Black+Perl · · Score: 2, Insightful

      I'd like to argue that Perl is very maintainable. Many studies show a correlation between LOC and number of defects. So the important thing is reducing the LOC written. The differences accountable to language syntax is negligable when you can reduce the amount of code you write by order(s) of magnitude. With Perl, you have CPAN (http://search.cpan.org/), a repository of pre-written, tested code, the vast majority of which are classes ready to use in object-oriented fashion. Now, I'm not going to say that Perl's OO syntax is anything but inelegant, but it works. What is elegant is the way CPAN works. I won't go into that here, but it does allow you to decrease by orders of magnitude the amount of code you have to write. There are great solutions for all kinds of things, such as object-relational mapping (point Class::DBI at your database, and you instantly have get/set methods to update your tables) and powerful templating (http://template-toolkit.org/), just to name a couple. There are 4000+ other examples there.

      As an example of reducing lines of code, here's an article on writing a database-driven web application in 18 lines of code, and a similar article here.

      But this doesn't apply to just database or web frameworks. Thanks to CPAN, this applies to anything you set out to do. CPAN modules (in general; there are exceptions) are encapsulated best practices, well tested, and a major productivity booster. And, they drastically reduce the amount of code you need to write, making your code more maintainable.

      --
      bp
  9. nice perl is possible by hey · · Score: 4, Insightful
    For example:
    sub main()
    {
    init();
    work();
    cleanup();
    }
    1. Re:nice perl is possible by abulafia · · Score: 5, Insightful
      Perl has always been a write only language that is only readable by the author.

      Funny. I'm supporting an app initially written about 8 years ago entirely in perl. It is about 80K lines. Outputs PDF by writing postscript directly (don't ask, but there are reasons for this). I came in about 3 years ago on it. None of the original developers (nor the original company) are around. Somehow, we still maintain an improve it. Maybe it isn't such a write-only language.

      I've lost track of the number of modules on cpan.org that are stuck at version y.xx and have not been updated in a long time and only work with versions of Perl *OLDER* than 5.3 because no one is able to correct the module to work with perl v5.3+

      I assume you've also lost count of all the C, Fortran, PHP, Pascal and Java projects that don't work in modern environments, too.

      Bottom line: If you can write good code in any language, you can write quality perl. Bad perl is easier to write than some languages, and I think that is a sign of utility. And don't get me started on some of the _bloody fucking awful_ Java I'm also supporting...

      --
      I forget what 8 was for.
  10. Re:Use a real language. by Camel+Pilot · · Score: 4, Insightful

    on what test? Take a fairly common task - word counting

    Perl 1.0 cpu time 11 lines of code.
    gcc 0.3 cpu time 182 lines of code.

    So i can distort reality also and say while C can sometimes be as fast as 3 times faster it will take 1700% more lines of code.

  11. Maintainability by XanC · · Score: 4, Insightful
    A lot of posts are complaining about Perl being unmaintainable, and suited to banging out a quick script in a half hour but not for anything more complex than that.

    Baloney. The advantage of Perl is that you have the option to write maintainably if you want to!

    If I just need a quick solution to a problem, I can very quickly write gibberish that does the job and then forget about it.

    If I'm writing a big app which someone will inherit from me, I can avoid confusing constructs for something easier to follow. I can pass variables in Perl style, C-style, I can use objects if I want. Whatever I think will be most maintainable for somebody else.

    Just because you can write gibberish in Perl doesn't mean you can't write good stuff too.

  12. Re:Nay by WWWWolf · · Score: 3, Funny

    Rrrrrrgh. People who suggest Python as Perl replacement are bonkers. People who suggest PHP instead of Perl or Python are clearly insane.

    My honest opinion is Ruby beats either as a Perl replacement - Ruby retains a lot of Perl ideas while succeeding in providing a very clean syntax.

    And people these days can't even do language trolls properly. Let me try. Ahem. hm. hm. hm. (climbs to mountaintop and shouts:) "We should rewrite the Perl programs in Common Lisp!" (dramatic echo) (gasping heard all over the world) (climbs down) There, much better. Now let's rewrite the apps in both common lisp and ruby! Before Perl 6 ships and we need to rewrite everything again, of course! Go on, hurry!

  13. Re:Nay by shobadobs · · Score: 4, Insightful

    PHP? Are you kidding me? There is nothing worse than PHP. PHP looks strewn together without thought. Just consider the system by which PHP's built-in functions are named. Except that there is no such system; the names follow all sorts of different casing rules.

    PHP was made by taking a cute language for embedding a broken imitation of Perl-esque syntax in-between HTML and extending it with bajillions of functions that badly needed to be namespaced. It never provided anything useful that Perl couldn't, except that it made newbies comfortable by making them feel like they're in "HTML land" instead of "Programming language land."

  14. Re:Comments to come: blah, Perl hard to read/maint by Uruk · · Score: 4, Insightful

    Yeah, but perl makes it easier to write shit. I happen to love perl and use it all the time, but I also have to be very disciplined about the aspects and particularly syntax conventions of the language that I use, in order to write readable perl. Just because you can write:

    do { thirty(); things(); in(); a(); list(); unformatted(); } if($foo);

    Doesn't mean that you should.

    One of the brilliant aspects of perl is that it allows you to write code like you think about code. Well doesn't that presuppose that other people are going to think about code the same way you do? Ooops.

    Books and books have been written on the need for code formatting, syntax, and variable naming conventions in languages that are twice as rigorous and disciplined as perl. In perl, the need is double.

    So I guess what I'm saying is that although shitty code is shitty code in any language, perl provides the possibility for a certain depth and richness of shit that just isn't accomodated in other languages. Kudos to the authors for addressing what is a real problem with a powerful and widely used programming language.

    --
    -- Truth goes out the door when rumor comes innuendo. -- Groucho Marx
  15. Re:Comments to come: blah, Perl hard to read/maint by Coryoth · · Score: 3, Insightful

    s/shitty perl code/shitty code in any language/;

    You can inherit shit in any language.


    That is true, but perl does provide easy ways to write sloppy or unmaintainable code. That's not necessarily a bad thing, because it is exactly that looseness that makes perl a very fast language to develop quick scripts in - there aren't anywhere near as many hoops to jump through and TIMTOWTDI makes it very easy to just write whatever you're thinking. For the niche of a language that lets you knock together something to do the job quickly perl is fine.

    If you want anything maintainable you need to forget all of that and make use strict and use warnings mandatory, and enforce some coding style standards. That can be done, and if you do that it is easy enough to write maintainable perl - it's just that you can't expect the language to help you with it much: you have to enforce and police the standards yourself.

    Jedidiah.

  16. Re:Perl != maintainable by Anonymous Coward · · Score: 2, Funny

    Ruby is a lot more like coding in perl.

    Than coding in what? Perl?!?

  17. Re:thanks for straightening me out. by Camel+Pilot · · Score: 2, Interesting

    You are the only one proposing the use of perl for everthing. Ever heard of a strawman, nice try but it is a weak attempt to prove whatever your point is.

    Are compiled languages faster than script style languges? Yes, typically. Are compiled languages always the best approach. No.

    Lets take a real world example. Recently I need to take a stream of data that was interleaved two byte time series. I had to demultiplex it and reverse the endian. I prototyped in perl and wrote the service version in C. Performance difference between C and Perl was 12%. Development time, even with the prototype was difference was more than double and with 4 times the code to maintain.

    I have similar stats with C versus Matlab for numerical processing.

  18. If you liked Peter's book, attend Peter's workshop by TomDLux · · Score: 2, Informative

    I agree, perl medic is a great book, influential in encouraging and developing good habits.



    Peter will be speaking, though not on the same topic, at YAPC:2005, June 27, 28, 29 in Toronto. There's a whole day's worth of workshops on perl6, including PUGS, most of a day on testing, as well as threads on DBI, CGI, and lots of other workshops. Register now! At $85US for registration, it's the best bargain you'll find this year.


    If you are planning to attend, Book your hotel room soon. The host hotel is only guaranteeing room availability till next weekend. There's a huge conference coming to Toronto a few days after YAPC, so the hotel wants to start making rooms available for early arrivals. Not that all the rooms will disappear the first day, but you wouldn't want to be disappointed, would you?



  19. Re:Nay by value_added · · Score: 2

    PHP was made by taking a cute language for embedding a broken imitation of Perl-esque syntax in-between HTML and extending it with bajillions of functions that badly needed to be namespaced. It never provided anything useful that Perl couldn't, except that it made newbies comfortable by making them feel like they're in "HTML land" instead of "Programming language land."

    I'll requote as I share the same opinion. In fact, I'd offer the argument that contrary to the "right tool for the job" advice that gets bandied about so frequently, if you write a lot of code in Perl, it's often more efficient to keep writing code in Perl, as there's very few areas where Perl doesn't shine.

    My personal opinions aside, I wonder how you would explain the widespread and seemingly increasing usage (and popularity) of PHP?

  20. I don't need a medic... by HomerJayS · · Score: 2, Funny

    Some of the code I've been forced to maintain needed Dr Kevorkian.

  21. Re:Nay by Just+Some+Guy · · Score: 4, Insightful
    My favorite bit of PHP idiocy is mysql_query() versus pg_query(). Given that the functions are basically identical except for the databases they access:
    1. Why is the first's prototype:
      resource mysql_query ( string query [, resource link_identifier] )
      while the second has its arguments reversed:
      resource pg_query ( resource connection, string query )
      ?
    2. Why is "mysql" spelled out, but "postgresql" or even "pgsql" abbreviated to just "pg"?

    I hate the language for its utter lack of consistency. People talk about how great the php.net documentation is but I think they have the causality reversed: those docs have to be excellent or the language would be unnavigable. I have no desire to remember 3500 core language functions with similar (but inconsistent) naming systems and a randomized argument list. Seriously, what were they thinking?

    I don't think PHP is inherently bad, but the current implementation certainly is.

    --
    Dewey, what part of this looks like authorities should be involved?
  22. Re:Use a real language. by mvdde_xh · · Score: 2, Insightful
    It may run slower than C in some cases. But you can crank out working perl script *much* faster than in C.

    Sometimes the developer's time is more important that the computer's time.

  23. Re:Perl != maintainable by snorklewacker · · Score: 2, Funny

    Oh crap! See parent!

    --
    I am no longer wasting my time with slashdot
  24. Re:Use a real language. by Shin+Chan · · Score: 2, Interesting

    Let's see (just a real life thing I tested earlier today... so yes, before this article got published)

    Running a "BOT" on the MSN Messenger network. Sending a 300 meg ISO to it, memory only "shot up" by an "amazing" 100KB. Average speed on sending, 150KB/s (as good as it get's on my connection).

    Now we hook up another conversation. Response time is excellent, transfer is not suffering nor are other connections. Ping time is 0.0788 seconds (that is, me server perl app, so it has to pass 4 "pipes", 2 to my app, 2 back to me).

    CPU usage stayed below 5% all the time. . The script has been running for nearly 3 days now, too. I'm sure your C app can shave off an amazing 0.01 something seconds and minimize memory usage to maybe only half. Point remains, Perl isn't slow when well written :)

    --
    Proud owner of BOT2K3 [ bot2k3.net ]