Advancing Perl 2010 (Luga 2010)
Wer bin ich?
Ulrich Habel
NetBSD Projekt
Autor
Veränderungen zu 5.8.x
Zeit zu aktualisieren! 5.10.1 ist draussen!
feature Pragma
Neue Funktionen einschalten, die die Rückwärtskompatiblität brechen
-E Switch
Einschalten aller neuen Features
Defined-or // operator
Switch and Smart match Feature
given ($foo) { when (/^abc/) { $abc = 1; } when (/^def/) { $def = 1; } when (/^xyz/) { $xyz = 1; } default { $nothing = 1; } }
regex Power
say()
use feature qw(switch say); # oder use feature ':5.10';
Lexical! Wow: { use feature 'say'; say "Yay!"; }
Lexical $_
{ my $_; # ... print $_ . "\n"; }
Vorbemerkungen
Perl funktioniert - immer
leider...
Google...
Perl 6
Perl 6?
Aufwachen!
AUFWACHEN!
Willkommen im Jetzt!
Perl6 Features in Perl5
Enlightened Perl
Organisation
Unterstützung von Projekten
mit Finanzen
mit Ressourcen
http://enlightenedperl.org
DBIx::Class
ORM (Object Relational Mapper) für Perl
alte Welt
select a, b from user where userid = 127;
Bruch zwischen Perl und SQL im Code
neue Welt
my $results = $obj->resultset( ‘User’ ) ->search( #.. );
Einsatz von DBIx::Class
result class = table
sql query in DBI entspricht DBIx::Class::ResultSet
Wichtig! Das Erzeugen eines ResultSets führt keine Abfrage durch!
Schema Klasse
package BR::Database::Schema; use base qw/DBIx::Class::Schema/; # Laden BR::Database::Schema::Result::* und resultset classes __PACKAGE__->load_namespaces(); 1;
package BR::Database::Schema::Result::Mediabox; use base qw/DBIx::Class/; __PACKAGE__->load_components(qw/Core /); __PACKAGE__->table('Mediabox'); __PACKAGE__->add_columns( Mpath => { data_type => 'varchar', size => 255, is_nullable => 0, default_value => '' }, Publishdate => { data_type => 'integer', is_nullable => 0, default_value => '', }, ); __PACKAGE__->set_primary_key(qw/Mpath/); 1;
my $rs = $self->schema->resultset('Mediabox')->search( { Mpath => $mpath } )->first;
Beziehungen können im Code definiert werden
__PACKAGE__->has_one( 'Media' => 'My::DB::Media', {'foreign.ID' => 'self.ID'} );
Auslesen bestehender Datenbanken (Schreiben der Klassen)
Database Deployment (Code Veränderung)
Catalyst
The elegant MVC framework
http://www.catalystframework.org/
Terminologie
Model
View
Controller
Trennen der einzelnen Schichten
Model: DBIx::Class
View: TT2, Mason, Template::Declare, HTML::Template
Enterprise Ready?
Yeo! :) (aber zensiert :) )
bspw. http://vox.com
Quick View
Anlegen einer Applikation
Controller hinzufügen
View hinzufügen
Moose
Postmodern Object System für Perl 5
Schon da :)
Akademisch korrekt OOP
OOP bislang?
Package
Subs im Package
Accessor handgeschrieben
A Class is Simply a Package (perlobj)
und jetzt?
Objekte werden durch Attribtute beschrieben
use strict; use warnings;
default!
sub new {}
built-in!
sub get_..... {}
built-in!
Types!
Roles!
neugierig?
Moose Beispiel
Motorrad
Marke
Farbe
default:rot
Beispielprogramm
#!/bin/env perl use Motorrad; my $fhz = Motorrad->new( marke => "Ducati" ); print $fhz->name; print $fhz->farbe; my $love = Motorrad->new ( marke => "BMW", farbe => "gelb" ); # ugh! Gelbe BMWs $love->farbe( "silber" );
pre-moose
#!/bin/env perl package Motorrad; use warnings; use strict; sub new { my ( $class, %opts ) = @_; my $self = { marke = $opts{ marke }, farbe = $opts{ farbe } || "rot", }; return bless $self, $class; } sub marke { my $self = shift; if (@_) { $self−>{marke} = shift } return $self−>{marke}; } sub farbe { my $self = shift; if (@_) { $self−>{farbe} = shift } return $self−>{farbe}; } 1;
moose!
#!/bin/env perl package Motorrad; use Moose; has marke => ( is => 'rw', isa => 'Str', ); has farbe => ( is => 'rw', isa => 'Str', default => 'rot', ); 1;
Attribute
Beschreibung eines Objekts
Syntax: has "attribute name" => ( # attribute definition };
Zugriff
is => 'rw' is => 'ro'
Type
isa => 'Str' isa => 'Int' isa => 'ArrayRef' isa => 'HashRef' isa => 'Date::Time'
Möglichkeit der eigenen Definition
Motorrad Typdefinition
subtype 'Gattung' => as 'Str' => where { /^(?:Supersport|Enduro)$/ } => message { "$_ ist keine gueltige Gattung (Supersport, Enduro)" }; has motorradart => ( isa => "Gattung", is => "ro", required => 1, documentation => "Gattung des Motorrads muss angeben werden.", );
Default Werte
default => 'String' default => 12345 default => sub{ [] } default => sub{ {} }
Required?
required => 1
Roles
"Interface" im Java Jargon
Geeignet zum Aufteilen von Objekten
"includes"
Example Session - the bicycle workshop
Fragen?
VIELEN DANK! (email: Ulrich Habel
Advancing Perl 2010 (Luga 2010)
Added: 2010-03-27 11:14:01
From: (Joined 2009-07-04 10:16:53)
348 views |56 downloads
Advancing Perl 2010 (Luga 2010)