Perl heute
This package has never done
anything and never will do
anything. If it changes,
that's a bug.
Please report it to
mst@shadowcat.co.uk where I
will proceed to ignore it.
4 Ansagen
4 Ansagen
kein Quiz
4 Ansagen
kein Quiz
Wählt Themenschwerpunkte
4 Ansagen
kein Quiz
Wählt Themenschwerpunkte
Fragen wenn Überschrift
4 Ansagen
kein Quiz
Wählt Themenschwerpunkte
Fragen wenn Überschrift
Folien abrufbar:
lichtkind.de
Benutzer lichtkind
De Perl Tut
de.perl.org wiki
de.perl.org
CPAN: lichtkind
de.perl.org
Perl 5.20
Vortrag =
heise.de Artikel
+ Modern Perl Buch
+ Perl Weekly ???
Perl 2014
Perl 5.20
auf Android +
WinCE
kompilierbar
Perl 5.20
CGI.pm,
Module::Build,
encoding.pm,
verlassen den Kern
Perl 5.20
Neue Optimierungen
Schnell (CoW,..)
Perl 5.20
kleine, wunderbare
Fixes und Features
März 2010
Dieser Vortrag:
große neue
Features
Dieser Vortrag:
Entwicklungs-
prozess
Sprachdesign
Dieser Vortrag:
Sprachdesign by
Community
Ablauf:
Perl 5.10 – 5.22
Perl 5.20
Perl Module
Perl Werkzeuge
Perl 6
Gemeinsamkeit:
Perl
Perl
Perl
Perl
Perl
Perl
Perl
Perl
Perl
,
Perl OO
Perl
Perl heute
Perl OO
Grüße aus den 80'ern
Perl 5.14
Perl 2000
Risiken
Handarbeit
Perl 2000
Risiken
Handarbeit
klare,einfache
defaults nicht überall
Philosophie
Was ist Perl?
TIMTOWTDI
Mächtigkeit oder
Einfachheit oder …
ist wählbar
TIMTOWTDI
Deine Entscheidung
wird geachtet
Perl
Programmiersprache
für erwachsene
Menschen
TIMTOWTDI
Mächtigkeit oder
Einfachheit oder …
ist wählbar
Perl 2000
Risiken
Handarbeit
klare,einfache
defaults nicht überall
Perl
in dubio pro
programmator
Perl 6
TIMTOWTDI
Mächtigkeit oder
Einfachheit oder …
erreichbar
Perl 6
“... to torture the
implementer on
behalf of the user.”
Perl 6
All VM Belong To Us
Perl Kultur
2005
2007
2007
Perl 5.10
2007
print ”$varn”;
say $var;
# viele Neuerungen, git
# neue Regex Engine
2007
use feature 'say'; # eines
use feature qw/.../; # mehr
# lexikalische Pragma
# viele Neuerungen
# neue Regex Engine
2007
use feature 'say'; # eines
use feature qw/.../; # mehr
use v5.10; # alle
# perl -E
# viele Neuerungen
# neue Regex Engine
2007
use feature 'switch';
given ($var) { # setzt $_
when (/^abc/) { … }
when ([1..5]) { … }
default { ... }
}
2010
use strict; # implizit
use v5.12; # alle
# jährliche releases
# jesse vincent (p6 manag.)
ACME
use strict;
Acme::Code::Police;
2002
use strict;
Acme::Code::FreedomFighter;
2010
use strict; # implizit
use v5.12; # alle
# given / when geändert
#
2011
use v5.14;
# Unicode 6, IPv6,
# Multithread
2012
use v5.16; # feature v. 5.16
use v5.14; # feature v. 5.14
# downgradable
2013
no warnings "experimental::switch";
use feature "switch";
use v5.18;
# perldoc perlexperiment
# manche feature sind
# experimental
2014
use experimental "switch";
use v5.20;
# perldoc perlexperiment
# Syntax::Construct
2014
use v5.20;
use feature qw/say state
switch unicode_strings
unicode_eval
evalbytes current_sub fc/;
2015
use v5.22;
# was kommt im Mai ?
2015
use v5.22;
# logische operatoren (p6)
# graph. & wortgrenzen (re)
# use strict für re
# refaliases, UTF 7
# <<>> double diamond op
Perl 5.20
use v5.20;
use latest;
use any::feature;
Perl 5.20
Installierbare Module !!!
use latest;
use any::feature;
Perl 5.20
Perl 5.20
use v5.20;
vs
use v5.16;
Perl 5.18
use v5.18;
Perl 5.18
use v5.18;
no warnings "switch";
Perl 5.18
use v5.18;
no warnings
"experimental::smartmatch";
Perl 5.18
use v5.18;
no warnings
"experimental::lexical_topic"
;
my $_ -----> local $_
Perl 5.18
use v5.18;
no warnings
"experimental::regex_sets";
Perl 5.18
use v5.18;
no warnings
"experimental::regex_sets";
! & | + - ^
Perl 5.18
use v5.18;
no warnings
"experimental::regex_sets";
/(?[ ( p{Thai} + p{Lao} )
& p{Digit} ])/
Perl 5.18
use v5.18;
no warnings
"experimental::lexical_subs";
Perl 5.18
use v5.18;
no warnings
"experimental::lexical_subs";
my sub { … }
our sub { … }
state sub { … }
Perl 5.20
use v5.20;
Perl 5.20
use v5.20;
use feature 'postderef';
Perl 5.20
use v5.20;
use feature 'postderef';
no warnings "experimental::postderef";
Perl 5.20
use v5.20;
use feature 'postderef';
no warnings "experimental::postderef";
use experimental 'postderef';
Pair Slices
Array/S. Kontext
my @array = ('d' .. 'f');
say @array; # alle Werte eines Array : d e f
say @array[0,1]; # Teilarray mit zwei Werten : d e
say $array[2]; # ein Wert aus gleichen Var.: f
A./Skalar Kontext
my @array = ('d' .. 'f');
say @array; # alle Werte eines Array : d e f
say @array[0,1]; # Teilarray mit zwei Werten : d e
say $array[2]; # ein Wert aus gleichen Var.: f
my %hash = (a => 1, b => 2, c => 3 );
say %hash; # alle Schlüssel & Werte: a 1 b 2 c 3
say @hash{'a','b'}; # Werten zweier Schlüssel: 1 2
say $hash{'c'}; # Wert des Schlüssels: 3
Pair Slices
my @array = ('d' .. 'f');
my %hash = (a => 1, b => 2, c => 3 );
say %array[0,1]; # im Wechsel Index/Wert: 0 d 1 e
say %hash{'a','b'}; # Schlüssel/Wert: a 1 b 2
Pair Slices
my @array = ('d' .. 'f');
my %hash = (a => 1, b => 2, c => 3 );
say %array[0,1]; # im Wechsel Index/Wert: 0 d 1 e
say %hash{'a','b'}; # Schlüssel/Wert: a 1 b 2
Perl 6:
say @array[0,1] :p; # Ausgabe: 0 => "d" 1 => "e"
say %hash<'a','b'> :p; # Ausgabe: "a" => 1 "b" => 2
Pair Slices on Ref
my $arrayref = ['d' .. 'f'];
my $hashref = {a => 1, b => 2, c => 3 };
say %$arrayref[0,1]; # Index/Wert: 0 d 1 e
say %$hashref{'a','b'}; # Schlüssel/Wert: a 1 b 2
Hashes in Perl 5
Postfix-Deref.
Postfix-Deref.
push $hash{'key'}, 'value';
Postfix-Deref.
push $hash{'key'}, 'value';
push @{$hash{'key'}}, 'value';
Postfix-Deref.
stört den Lesefluss
push @{$hash{'key'}}, 'value';
Postfix-Deref.
$array[2][7]; # ein Wert, wie bekannt
$array[2]->[7]; # dasselbe
Postfix-Deref.
$array[2][7]; # ein Wert, wie bekannt
$array[2]->[7]; # dasselbe
$array[2]->@[7]; # kein Vorteil soweit
Postfix-Deref.
$array[2][7]; # ein Wert, wie bekannt
$array[2]->[7]; # dasselbe
$array[2]->@[7]; # kein Vorteil soweit
$array[2]->@[5,6]; # 2 Werte, gleichbedeutend mit:
@{$array[2]}[5,6]; # ging bisher nur so
$array[2]->%[5,6]; # auch Pair Slices möglich
$hash{'a'}->%{'g','e'}; # bei verschachtelten Hashes
Postfix-Deref.
$array[2][7]; # ein Wert, wie bekannt
$array[2]->[7]; # dasselbe
$array[2]->@[7]; # kein Vorteil soweit
$array[2]->@[5,6]; # 2 Werte, gleichbedeutend mit:
@{$array[2]}[5,6]; # ging bisher nur so
$array[2]->%[5,6]; # auch Pair Slices möglich
$hash{'a'}->%{'g','e'}; # bei verschachtelten Hashes
$array[2]->@* # gesamter Unterarrayinhalt
$array[2]->$#* # Anzahl der Elemente
Postfix-Deref.
$array[2][7]; # ein Wert, wie bekannt
$array[2]->[7]; # dasselbe
$array[2]->@[7]; # kein Vorteil soweit
$array[2]->@[5,6]; # 2 Werte, gleichbedeutend mit:
@{$array[2]}[5,6]; # ging bisher nur so
$array[2]->%[5,6]; # auch Pair Slices möglich
$hash{'a'}->%{'g','e'}; # bei verschachtelten Hashes
$array[2]->@* # gesamter Unterarrayinhalt
$array[2]->$#* # Anzahl der Elemente
$array[2]->*{ARRAY} # GLOB / symbol Tabelle
Postfix-Deref.
$array[2][7]; # ein Wert, wie bekannt
$array[2]->[7]; # dasselbe
$array[2]->@[7]; # kein Vorteil soweit
$array[2]->@[5,6]; # 2 Werte, gleichbedeutend mit:
@{$array[2]}[5,6]; # ging bisher nur so
$array[2]->%[5,6]; # auch Pair Slices möglich
$hash{'a'}->%{'g','e'}; # bei verschachtelten Hashes
$array[2]->@* # gesamter Unterarrayinhalt
$array[2]->$#* # Anzahl der Elemente
$array[2]->*{ARRAY} # GLOB / symbol Tabelle
“$hash{a}->%{g,e}” # sogar interpoliert
Sprachdesign++:
Lesefluss: von links nach rechts
konsistent mit allem Bisherigen
keine Ausnahmen
1 neue Syntaxregel
Signaturen
use experimental 'signatures';
sub sag ($subjekt, $praedikat, $objekt) {
say "$subjekt $praedikat $objekt.";
}
Signaturen
Signaturen
Signaturen
use experimental 'signatures';
sub sag ($subjekt, $praedikat, $objekt) {
say "$subjekt $praedikat $objekt.";
}
Signaturen
sub sag {
my($subjekt, $praedikat, $objekt)=@_;
say "$subjekt $praedikat $objekt.";
}
Signaturen
use experimental 'signatures';
sub sag ($subjekt, $praedikat, $objekt) {
my ($sub, $praed, $obj) = @_;
say "$subjekt $praedikat $objekt.";
say "$sub $praed $obj.";
}
Signaturen
sag ( "Du" );
sag ( "Du", "hast" );
sag ( "Du", "hast", "mich" );
sag ( "Du", "hast", "mich", "gefragt" );
Error
sag ( "Du" );
sag ( "Du", "hast" );
sag ( "Du", "hast", "mich" );
sag ( "Du", "hast", "mich", "gefragt" );
Prototypen
sub sag ($$;$) {
say "$_[0] $_[1] $_[2].";
}
Prototypen
use experimental 'signatures';
sub :prototype($$;$)
($subjekt, $praedikat, $objekt) {
say "$subjekt $praedikat $objekt.";
}
Signaturen
use experimental 'signatures';
sub sag ($, $praedikat, $objekt) {
say "Ich $praedikat $objekt.";
}
Prototyp Attribut
use experimental 'signatures';
sub :prototype($$;$)
($subjekt, $praedikat, $objekt) {
say "$subjekt $praedikat $objekt.";
}
Signaturen
use experimental 'signatures';
sub sag ($subjekt, $ =, $objekt) {
say "$subjekt vermutet $objekt.";
}
Signaturen
use experimental 'signatures';
sub sag ($subjekt, $praedikat, $ =) {
say "$subjekt $praedikat Snowden.";
}
Signaturen
use experimental 'signatures';
sub sag ($subjekt, $praedikat, @) {
say "$subjekt $praedikat Snowden.";
}
“Slurpy” Array
use experimental 'signatures';
sub sag($subjekt, $praedikat,@objekte){
say "$subjekt $praedikat @objekte.";
}
“Slurpy” Hash
use experimental 'signatures';
sub sag ($subjekt, %praed_objekt) {
say $subjekt, " ", %praed_objekt,".";
}
Module
Task::Kensho,
M[o[o[se|ps]]],
Type::Tiny, Try::Tiny,
Future, autodie,
Data::Printer, Sereal,
IO::All
Task::Kensho
Erleuchtung
Moose
Moose
kompatible Objekte
Moose
auto getter/setter, delegation,
defaultwerte, trigger, lazy eval,
signaturen, typprüfung,
rollen, eigene subtypen,
method mod, inside out
delegation,
wesentlich mehr Komfort
Moose
auto getter/setter, delegation,
defaultwerte, trigger, lazy eval,
signaturen, typprüfung,
rollen, eigene subtypen,
method mod, inside out
delegation,
wesentlich mehr Komfort
MooseX
Class::MOP
MooseX::Declare
auto: getter/setter
Moops
auto: getter/setter
Mouse
Elche ohne Geweih?
Mouse
Elche ohne Geweih?
Nein nur schneller dank XS
Moo
Moo
minimale OO in Perl
schnell, klein, praktisch
kompatibel wie möglich
Mo
package Mo;
$VERSION=0.39;
no warnings;
my$M=__PACKAGE__.'::';*{$M.Object::new}=sub{my$c=shift;my$s=
bless{@_},$c;my%n=%{$c.::.':E'};map{$s->{$_}=$n{$_}->()if!exists$s-
>{$_}}keys%n;$s};*{$M.import}=sub{import warnings;$^H|
=1538;my($P,%e,%o)=caller.'::';shift;eval"no Mo::$_",&{$M.$_.::e}
($P,%e,%o,@_)for@_;return if$e{M};%e=(extends,sub{eval"no
$_[0]()";@{$P.ISA}=$_[0]},has,sub{my$n=shift;my$m=sub{$#_?$_[0]
{$n}=$_[1]:$_[0]{$n}};@_=(default,@_)if!($#_%2);$m=$o{$_}->($m,
$n,@_)for sort keys%o;*{$P.$n}=$m},%e,);*{$P.$_}=$e{$_}for keys
%e;@{$P.ISA}=$M.Object};
M
package M;
$VERSION=1;
M
package M;
$VERSION=1;
Nothing::Tiny
M Dokumentation
This package has never done
anything and never will do
anything. If it changes,
that's a bug.
Please report it to
mst@shadowcat.co.uk where I will
proceed to ignore it.
MST gewonnen ?
mop redux
Perl OO in XS/C
5.24 ??
Type::Tiny
Try::Tiny
try / catch / finally
Future
Versprechen (promise)
Sag mir wie weit du bist. /
Ergebnis
Promise
Versprechen (promise)
node.js API
Future
Logik utils
Python twisted: deferred
Java ?
Future
Paul Evans
IO::Async
EV / Coro / AE
Marc Lehmann
POE
1998
Rocco Caputo
autodie
use autodie;
Data::Printer
Data::Printer
Datenstrukturen
auch Objekte
Formatiert in Farbe
Sereal
Sereal
Daten auf Platte
und zurück
schnell und kompakt
IO::All
IO::All
$inhalt < io 'datei.txt';
$inhalt = io 'datei.txt';
$inhalt = io->file('..')->slurp;
@inhalte = io->dir('..')->all;
$io = io('my/dir/'); # %$io
IO::All
say $_->getline
for io->dir('dir')->all_files;
IO::All
say $_->getline
for io->dir('dir')->all_files;
1. Zeilen der Dateien
IO::All
Dateien, Verzeichnisse,
Iteratoren, Rückwärts, stat,
STDIN, STDOUT, Pipes,
Sockets, DBM
IO::All
Dateien, Verzeichnisse,
Iteratoren, Rückwärts, stat,
STDIN, STDOUT, Pipes,
Sockets, DBM
Plugins: Mail, LWP
IO::All
use IO::ALL;
my $socket = io(':80')->fork->accept;
$socket->print($_) while <DATA>;
$socket->close;
__DATA__
<!DOCTYPE html>
...
Mojolicious
Dancer ?
Werkzeuge
MetaCPAN
cpanminus, perlbrew,
carton, Dist::Zilla,
Perl::Critic, NYTProf
rxrx, ack, asciio
Werkzeuge
Werkzeuge
App::cpanminus
App::cpanminus
installiert Module
keine Konfiguration
App::cpanminus
curl -L https://cpanmin.us |
perl - --sudo
App::cpanminus
App::perlbrew
App::perlbrew
lokales Perl
einfacher Wechsel
[Massen]test
Perl::Build
local::lib
Object::Remote
Carton
Dependency Manager
Carton
FatPacker
Cava
PAR
Dist::Zilla
GODZILLA
OVERKILL!!
Perl::Critic
Prüft Quellcode
5 Brutalitätsstufen
Basierend auf PBP + C.C.
Eigene Regeln
projektbezogene Regelweke
Damian Conway
Devel::NYTProf
intelligenter Profiler
schnell, genau
HTML - Reports
Flammenansicht
Devel::NYTProf
Devel::NYTProf
rxrx
Regex REPL und Debugger
vis. Nav. ASCII, aber bunt
versteht gesamte Perl rx
Damian Conway(Parse::RecDescent)
rxrx
rxrx
App::Ack (ack)
grep für Programmierer
Perl Regex
Ignoriert unwichtiges
file & dir selection
App::Asciio
Diagramme und Graphiken
in ASCII
auf Knopfdruck
aus der ASCII - App
Mehr Info:
[de.]perl.org
perl-magazin.de
perl-tutorial.org
perl.com perlsphere.net
perl-tutorial.org
6. - 8. Mai DPW
Dresden ist schön
Danke

Perl 5.20: Feature, Kultur, Module, Werkzeuge