Perl, modules de production

Sébastien Aperghis-Tramoni, sebastien@aperghis.net

Modules de production

  • DBI

  • XML::LibXML

  • Dancer

DBI

  • API générique et universelle d'accès aux bases de données

  • comparable à JDBC (Java)

  • très nombreux pilotes (DBD, Database Driver) disponibles :

    • MySQL, PostgreSQL, SQLite, Oracle, JDBC, ODBC, DB2..

  • mais aussi DBD::WMI

DBI - connect()

  • DBI->connect(DSN, USERNAME, PASSWORD, ATTRIBUTES)

  •     use DBI;
    
        my $dbh = DBI->connect(
            "dbi:Pg:host=dbhost;dbname=mybase",
            $login, $password, { RaiseError => 1 }
        );

DBI - connect()

  • DSN, Data Source Name

  • dbi:Pg:host=dbhost;dbname=mybase

  • genre d'URI

    • "dbi:"

    • nom du module implémentant le pilote, automatiquement chargé par DBI

    • arguments du module

DBI - connect()

  • USERNAME, nom d'utilisateur, si applicable

  • PASSWORD, mot de passe, si applicable

  • ATTRIBUTES (optionel), référence vers un hash contenant des attributs DBI

    • AutoCommit, contrôle le support des transactions

    • RaiseError, force les erreurs à provoquer des exceptions

    • ShowErrorStatement, d'afficher la requête qui a provoqué l'erreur

    • TraceLevel, contrôle du mécanisme de traces d'exécution

    • Profile, contrôle du mécanisme de profilage d'exécution

DBI - méthodes diverses

  • $dbh->ping() pour vérifier si on est encore connecté

  • $dbh->disconnect() pour se déconnecter

DBI - méthodologie

  • protocole en 4 étapes

    • prepare (préparation)

    • bind (liaison)

    • execute (exécution)

    • fetch (récupération).

DBI - prepare

  • analyse de la requête pour recherche de marqueurs (placeholders)

  • permet le passage de valeurs de manière sécurisée

  • ne jamais interpoler de variable avec une valeur venant de l'extérieur

  •     my $sth = $dbh->prepare(
            "SELECT * FROM library WHERE author LIKE ?"
        );

DBI - bind, execute

  • passage des valeurs

  •     $sth->execute("Naoki Urasawa");

DBI - fetch

  •  my @row = $sth->fetchrow_array();
     # @row = ( "PLUTO volume 1", "2010-02-19", "Naoki Urasawa", "Kana" )
  •  my $row = $sth->fetchrow_arrayref();
     # $row = [ "PLUTO volume 1", "2010-02-19", "Naoki Urasawa", "Kana" ]
  •  my $row = $sth->fetchrow_hashref();
     # $row = { title => "PLUTO volume 1",
     #          date => "2010-02-19",
     #          author => "Naoki Urasawa", ... }

DBI - fetch

  •  my $rows = $sth->fetchall_arrayref();
     # $rows = [
     # [ "PLUTO volume 1", "2010-02-19", "Naoki Urasawa" ],
     # [ "PLUTO volume 2", "2010-02-19", "Naoki Urasawa" ],
     # [ "PLUTO volume 3", "2010-04-02", "Naoki Urasawa" ],
     # ...
     # ]
  •   my $rows = $sth->fetchall_hashref("title");
      # $rows = {
      #   "PLUTO volume 1" => {
      #     date   => "2010-02-19",
      #     author => "Naoki Urasawa",
      #   },
      #   "PLUTO volume 2" => {
      #     date   => "2010-02-19",
      #     author => "Naoki Urasawa",
      #   },
      #   "PLUTO volume 3" => {
      #     date   => "2010-04-02",
      #     author => "Naoki Urasawa",
      #   },
      #   ...
      # }

DBI - do()

  • pour les requêtes hors SELECT

  • combine les 4 étapes

  •     $dbh->do("TRUNCATE logs");
  •     my $n = $dbh->do(
            "DELETE FROM events WHERE host=? AND service=?",
            {}, $host, $service,
        );

DBI - erreurs

  • $sth->err() : numéro d'erreur

  • $sth->errstr() : descriptif d'erreur

XML::LibXML

  • module Perl d'interface à la bibliothèque libxml2

  • support DOM, SAX, XPath

  • support (X)HTML

XML::LibXML - analyse HTML

  •     use LWP::Simple;
        use XML::LibXML;
    
        my $parser  = XML::LibXML->new;
        my $html    = get("http://mongueurs.net/");
        my $htmldoc = $parser->parse_html_string($html);

XML::LibXML - analyse XML

  •  <?xml version="1.0"?>
     <host>
       <name>www01.dcf.domain.net</name>
       <network>
         <interface name="eth0">
           <address type="ipv4" prefix="24">10.0.0.132</address>
           <address type="ipv6" prefix="64"
             >2a01:e35:2f26:dde0:213:51af:fe7c:b4d8</address>
         </interface>
       </network>
       <os>
         <type>Mac OS X</type>
         <version>10.6.4</version>
         <kernel>Darwin Kernel Version 10.4.0: Fri Apr 23 18:28:53
         PDT 2010; root:xnu-1504.7.4~1/RELEASE_I386</kernel>
         <arch>i486</arch>
       </os>
       <uptime>5895074.06</uptime>
       <!-- ... -->
     </host>

XML::LibXML - analyse XML

  •     use XML::LibXML;
    
        my $parser  = XML::LibXML->new;
        my $dom     = $parser->parse_file("www01.dcf.domain.net.xml");

XML::LibXML - analyse XML, API DOM

  •     my $root = $dom->documentElement();
        my ($node) = $root->getChildrenByTagName("name");
        print $node->nodeName(), " = ", $node->textContent(), "\n";
  •     my ($network)   = $root->getChildrenByTagName("network");
        my ($interface) = $network->getChildrenByTagName("interface");
        my (@nodes)     = $interface->getChildrenByTagName("address");
    
        for my $node (@nodes) {
            next unless $node->nodeType == XML_ELEMENT_NODE;
    
            if ($node->getAttribute("type") eq "ipv4") {
                print $node->textContent, "\n";
            }
        }

XML::LibXML - analyse XML, XPath

  •  my ($addr_node) = $dom->findnodes('//interface/address[@type="ipv4"]');
     print $addr_node->textContent(), "\n";
  •  my $ipv4 = $dom->findvalue('//interface/address[@type="ipv4"]');

Dancer

  • micro-framework web

  • portage de Sinatra (Ruby)

  • basé sur PSGI

PSGI

  • mécanisme de remplacement de CGI

  • adapté de WSGI (Python) et Rake (Ruby)

  • permet le chaînage de composants

  • (programmation LEGO)

Dancer

  •     use Dancer;
    
        get '/' => sub { 
              return "Hello World!\n";
        };
    
        start;

Dancer

  •     use Dancer;
    
        get '/hello/:name' => sub {
            return "Why, hello there " . params->{name} . "\n";
        };
    
        dance;

Lecture

  • Perl moderne

  • expressions régulières actuelles

  • objet moderne avec Moose

  • bases de données avec DBI

  • programmation événementielle avec POE

  • navigation sur le web avec LWP et WWW::Mechanize

  • http://perlmoderne.fr/