perl 5.20: feature, kultur, module, werkzeuge

195
Perl heute This package has never done anything and never will do anything. If it changes, that's a bug. Please report it to [email protected] where I will proceed to ignore it.

Upload: lichtkind

Post on 17-Jul-2015

76 views

Category:

Software


0 download

TRANSCRIPT

Perl heute

This package has never doneanything and never will doanything. If it changes,that's a bug.Please report it [email protected] where Iwill 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.20CGI.pm,

Module::Build,encoding.pm,

verlassen den Kern

Perl 5.20

Neue Optimierungen

Schnell (CoW,..)

Perl 5.20

kleine, wunderbareFixes und Features

März 2010

Dieser Vortrag:

große neueFeatures

Dieser Vortrag:

Entwicklungs-prozess

Sprachdesign

Dieser Vortrag:

Sprachdesign byCommunity

Ablauf:

Perl 5.10 – 5.22Perl 5.20

Perl ModulePerl 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 2000Risiken

Handarbeit

Perl 2000Risiken

Handarbeit

klare,einfachedefaults nicht überall

Philosophie

Was ist Perl?

TIMTOWTDI

Mächtigkeit oderEinfachheit oder …

ist wählbar

TIMTOWTDI

Deine Entscheidungwird geachtet

Perl

Programmiersprachefür erwachsene

Menschen

TIMTOWTDI

Mächtigkeit oder Einfachheit oder …

ist wählbar

Perl 2000Risiken

Handarbeit

klare,einfachedefaults nicht überall

Perl

in dubio proprogrammator

Perl 6

TIMTOWTDI

Mächtigkeit oderEinfachheit oder …

erreichbar

Perl 6

“... to torture theimplementer on

behalf of the user.”

Perl 6

All VM Belong To Us

Perl Kultur

2005

2007

2007

Perl 5.10

2007print ”$var\n”;say $var;

# viele Neuerungen, git# neue Regex Engine

2007use feature 'say'; # einesuse feature qw/.../; # mehr

# lexikalische Pragma# viele Neuerungen# neue Regex Engine

2007use feature 'say'; # einesuse feature qw/.../; # mehruse v5.10; # alle# perl -E# viele Neuerungen# neue Regex Engine

2007use feature 'switch';

given ($var) { # setzt $_ when (/^abc/) { … } when ([1..5]) { … } default { ... }}

2010

use strict; # implizituse 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; # implizituse v5.12; # alle

# given / when geändert#

2011

use v5.14;

# Unicode 6, IPv6,# Multithread

2012

use v5.16; # feature v. 5.16use v5.14; # feature v. 5.14

# downgradable

2013no 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 stateswitch unicode_strings unicode_evalevalbytes current_sub fc/;

2015

use v5.22;

# was kommt im Mai ?

2015use 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; vsuse v5.16;

Perl 5.18use v5.18;

Perl 5.18use v5.18;no warnings "switch";

Perl 5.18use v5.18;no warnings "experimental::smartmatch";

Perl 5.18use v5.18;no warnings "experimental::lexical_topic";

my $_ -----> local $_

Perl 5.18use v5.18;no warnings "experimental::regex_sets";

Perl 5.18use v5.18;no warnings "experimental::regex_sets";

! & | + - ^

Perl 5.18use v5.18;no warnings "experimental::regex_sets";

/(?[ ( \p{Thai} + \p{Lao} ) & \p{Digit} ])/

Perl 5.18use v5.18;no warnings "experimental::lexical_subs";

Perl 5.18use 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. Kontextmy @array = ('d' .. 'f');say @array; # alle Werte eines Array : d e fsay @array[0,1]; # Teilarray mit zwei Werten : d esay $array[2]; # ein Wert aus gleichen Var.: f

A./Skalar Kontextmy @array = ('d' .. 'f');say @array; # alle Werte eines Array : d e fsay @array[0,1]; # Teilarray mit zwei Werten : d esay $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 3say @hash{'a','b'}; # Werten zweier Schlüssel: 1 2say $hash{'c'}; # Wert des Schlüssels: 3

Pair Slicesmy @array = ('d' .. 'f');my %hash = (a => 1, b => 2, c => 3 );

say %array[0,1]; # im Wechsel Index/Wert: 0 d 1 esay %hash{'a','b'}; # Schlüssel/Wert: a 1 b 2

Pair Slicesmy @array = ('d' .. 'f');my %hash = (a => 1, b => 2, c => 3 );

say %array[0,1]; # im Wechsel Index/Wert: 0 d 1 esay %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 Refmy $arrayref = ['d' .. 'f'];my $hashref = {a => 1, b => 2, c => 3 };

say %$arrayref[0,1]; # Index/Wert: 0 d 1 esay %$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.";}

Signaturenuse 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,".";}

ModuleTask::Kensho,M[o[o[se|ps]]],

Type::Tiny, Try::Tiny,Future, autodie,

Data::Printer, Sereal,IO::All

Task::Kensho

Erleuchtung

Moose

Moose

kompatible Objekte

Mooseauto getter/setter, delegation,defaultwerte, trigger, lazy eval,signaturen, typprüfung,rollen, eigene subtypen,method mod, inside outdelegation,wesentlich mehr Komfort

Mooseauto getter/setter, delegation,defaultwerte, trigger, lazy eval,signaturen, typprüfung,rollen, eigene subtypen,method mod, inside outdelegation,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

Mopackage 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};

Mpackage M;$VERSION=1;

Mpackage M;$VERSION=1;

Nothing::Tiny

M Dokumentation

This package has never doneanything and never will doanything. If it changes,that's a bug.Please report it [email protected] where I willproceed 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: deferredJava ?

Future

Paul Evans

IO::Async

EV / Coro / AE

Marc Lehmann

POE

1998Rocco Caputo

autodie

use autodie;

Data::Printer

Data::Printer

Datenstrukturenauch 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, DBMPlugins: Mail, LWP

IO::Alluse IO::ALL;

my $socket = io(':80')->fork->accept;$socket->print($_) while <DATA>;$socket->close;

__DATA__<!DOCTYPE html>...

Mojolicious

Dancer ?

Werkzeuge

MetaCPANcpanminus, 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

GODZILLAOVERKILL!!

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