DBI
XML::LibXML
Dancer
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
connect()
DBI->connect(DSN, USERNAME, PASSWORD, ATTRIBUTES)
use DBI; my $dbh = DBI->connect( "dbi:Pg:host=dbhost;dbname=mybase", $login, $password, { RaiseError => 1 } );
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
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
$dbh->ping()
pour vérifier si on est encore connecté
$dbh->disconnect()
pour se déconnecter
protocole en 4 étapes
prepare (préparation)
bind (liaison)
execute (exécution)
fetch (récupération).
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 ?" );
passage des valeurs
$sth->execute("Naoki Urasawa");
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", ... }
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", # }, # ... # }
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, );
$sth->err()
: numéro d'erreur
$sth->errstr()
: descriptif d'erreur
module Perl d'interface à la bibliothèque libxml2
support DOM, SAX, XPath
support (X)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 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>
use XML::LibXML; my $parser = XML::LibXML->new; my $dom = $parser->parse_file("www01.dcf.domain.net.xml");
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"; } }
my ($addr_node) = $dom->findnodes('//interface/address[@type="ipv4"]'); print $addr_node->textContent(), "\n";
my $ipv4 = $dom->findvalue('//interface/address[@type="ipv4"]');
micro-framework web
portage de Sinatra (Ruby)
basé sur PSGI
mécanisme de remplacement de CGI
adapté de WSGI (Python) et Rake (Ruby)
permet le chaînage de composants
(programmation LEGO)
use Dancer; get '/' => sub { return "Hello World!\n"; }; start;
use Dancer; get '/hello/:name' => sub { return "Why, hello there " . params->{name} . "\n"; }; dance;
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