Perl Cookbook, 2nd Edition

Tonight was Papa night, which meant that I got to look after Maeve while Jen worked late doing a group at work. Last week, Maeve and I established that Papa Night would always include going to the bookstore, which means Barnes & Noble in South Burlington.

Last week, Maeve was perfectly content to look at books by herself, and didn't want me interfering, so I decided this week to grab a book for myself to peruse while she was busy. It didn't work as I intended — Maeve saw that I wasn't paying full attention to her, and then demanded my attention — but I was able to look through some of the new items in the second edition of The Perl Cookbook.

Among them were:

  • Setting up both an XML-RPC server and client, using SOAP::Lite

  • Setting up both a SOAP-RPC server and client, using SOAP::Lite and other modules; I could have used this in ROX::Filer to communicate with ROX instead of using the filer's RPC call.

  • Better coverage of DBI (it actually covered it!):

    • When you expect only a single row, this is a nice way to grab it:

      $row = $dbi->selectrow_(array|hash)ref($statement)
      
    • This is a great way to grab a bunch of columns from a large resultset:

      $results = $dbi->selectall_hashref($sql);
      foreach $record (keys(%{$results})) {
          print $results->{$record}{fieldname};
      }
      
    • This one is nice for a large resultset from which you only want one column:

      $results = $dbi->selectcol_arrayref($sql);
      foreach $result (@{$results}) {
          print $result;
      }
      
    • If you need to quote values before inserting them, try:

      $quoted = $dbi->quote($unquoted);
      $sql = "UPDATE table SET textfield = $quoted";
      
    • If you need to check for errors, don't check with each DBI call; instead, wrap all of them in an eval statement:

      eval {
          $sth = $dbi->prepare($sql);
          $sth->do;
          while ($row = $sth->fetchrow_hashref) {
              ...
          }
      }
      if ($@) {
          print $DBI::errstr; 
      }
      
  • Coverage of templating, including Text::Template (very interesting!)

  • Whole new chapters on mod_perl and XML (including DOM!) which I didn't really even get to peruse.

  • autouse pragma: if you use:

    use autouse Module::Name;
    

    perl will use the module at runtime instead of compiletime; basically, it only uses it if it actually needs it (i.e., if it encounters code that utilizes functionality from that module). It's a good way to keep down on the bloat — I should use this with librox-perl, and possibly with CGI::App.