Ausgabe 4/2007 – www.foo-magazin.de – 6,00 €

$fooPERL MAGAZIN

Moose Objektorientierung mit in Caching in Webapplikationen Das merk’ ich mir... VOIP mit Net::Sip Internettelefonie mit Perl Neu, schön und grün: $foo im neuen Design – was ab sofort für immer und nur heute anders ist. Astaro steht für benutzerfreundliche und kosteneffiziente Netzwerksicherheitslösungen. Heute sind wir eines der führenden Unternehmen im Bereich der Internet Security mit Vorwort Sichern Sie Ihren einem weltweiten Partnernetzwerk und Büros in Karlsruhe, Boston und Hongkong. Eine Schlüsselrolle im Hinblick auf unseren Erfolg spielen unsere Mitarbeiter und hoffentlich nächsten Schritt demnächst auch Sie! Astaro bietet Ihnen mit einer unkomplizierten, kreativen Arbeits- umgebung und einem dynamischen Team beste Voraussetzungen für Ihre berufliche in die Zukunft Karriere in einem interessanten, internationalen Umfeld.

Zur Verstärkung unseres Teams in Karlsruhe suchen wir zum nächstmöglichen Eintritt:

Perl Backend Developer (m/w) Perl-Programmierer Ihre Aufgaben sind: (homo perligata)  Entwicklung und Pflege von Software-Applikationen  Durchführung eigenständiger Programmieraufgaben  Optimierung unserer Entwicklungs-, Test- und Produktsysteme  Tatkräftige Unterstützung beim Aufbau und der Pflege des internen technischen Know-hows Die letzten Wochen und Monate waren geprägt von Perlmon- nicht geben. So gibt es wohl in Erlangen ein schwarzes Loch Unsere Anforderungen an Sie sind: ger-Treffen, YAPC, berufliche Treffen und anderen Begeg- für $foo-Ausgaben. Dort verschwindet das Lesematerial des  Fundierte Kenntnisse in der Programmiersprache Perl, weitere Kenntnisse nungen mit anderen Perl-Programmierern. Dabei fällt mir „homo perligata“ auf unerklärliche Weise – oder ist der Brief- in anderen Programmier- oder Script-Sprachen wären von Vorteil  Selbstständiges Planen, Arbeiten und Reporten auf, dass der Perl-Programmierer im Allgemeinen eine be- träger ein heimlicher Perl-Programmierer? In Wien, Luxem-  Fließende Deutsch- und Englischkenntnisse sondere Art von Mensch ist – darum taufe ich diese Sorte von burg und anderen Bereichen von Europa gibt es hingegen Mensch mal „homo perligata“. eine Raum-Zeit-Verschiebung, die nach zwei erfolgreichen Software Developer (m/w) Zustellungen, eine dritte Zustellung des Magazins verhin- Ihre Aufgaben sind: Egal wohin man kommt und wie gut man die Anderen bei dert.  Entwicklung und Pflege von Software-Applikationen einem Treffen kennt, man wird sofort freundlich aufgenom-  Durchführung eigenständiger Programmieraufgaben men - so als würde man schon seit etlichen Jahren dazuge- Aber bei allen die diese Ausgabe in den Händen halten, scheint  Optimierung unserer Entwicklungs-, Test- und Produktsysteme  Tatkräftige Unterstützung beim Aufbau und der Pflege des hören. Ich hoffe, die YAPC-Neulinge empfanden das genauso. alles geklappt zu haben. Dann wünsche ich allen „homo per- internen technischen Know-hows Die Perl-„Gurus“ sind absolut normale Typen (ok, manche ligata“ viel Spaß mit der vierten Ausgabe von $foo. Unsere Anforderungen an Sie sind: sind schon etwas abgedreht aber auf eine nette Art und Wei-

 Kenntnisse in den Programmiersprachen Perl, C und/oder C++ unter Linux, se) mit denen man sich unterhalten kann wie mit jedem An- Die Codebeispiele können mit dem Code weitere Kenntnisse in anderen Programmier- oder Script-Sprachen wären von deren. X1MJjA Vorteil von der Webseite heruntergeladen werden.  Kompetenz in den Bereichen von Internet Core Protokollen wie SMTP, FTP, POP3 und HTTP À propos YAPC... Ein wenig verrückt muss man wohl als  Selbstständiges Planen, Arbeiten und Reporten „homo perligata“ sein, denn das Orga-Team aus Wien ist mit  Fließende Deutsch- und Englischkenntnisse orangenen Haaren rumgelaufen und die nächsten Organisa- Viel Spaß beim Lesen!

Astaro befindet sich in starkem Wachstum und ist gut positioniert um in den Märkten toren werden die YAPC::Europe 2008 mit einer schwedischen Renée Bäcker für IT-Sicherheit und Linux-Adaption auch langfristig ein führendes Unternehmen zu Flagge auf der Stirn rumlaufen – und das obwohl die YAPC in sein. In einer unkomplizierten und kreativen Arbeitsumgebung finden Sie bei uns Kopenhagen stattfindet. sehr gute Entwicklungsmöglichkeiten und spannende Herausforderungen. Wir bieten Ihnen ein leistungsorientiertes Gehalt, freundliche Büroräume und subventionierte Sportangebote. Und nicht zuletzt offeriert der Standort Karlsruhe eine hohe Lebens- Das ist komischerweise bei anderen Programmiersprachen qualität mit vielen Möglichkeiten zur Freizeitgestaltung in einer der sonnigsten nicht so ausgeprägt bis gar nicht vorhanden. Das habe ich auf Gegenden Deutschlands. der letzten EuroOSCON gemerkt und bekomme das von eini-

Interessiert? gen Java-Entwicklern immer wieder zu hören. Dann schicken Sie bitte Ihre vollständigen Unterlagen mit Angabe Ihrer Gehaltsvor- Der Perl-Programmierer ist ein geselliger Mensch und ist ger- stellung an [email protected]. Detaillierte Informationen zu den hier beschriebenen ne in der „Community“. Außenstehende können das nicht Stellenangeboten und weitere interessante Positionen finden Sie unter www.astaro.de. Wir freuen uns darauf, Sie kennen zu lernen! immer begreifen, aber ist man einmal „drin“, ist es absolut toll. Astaro AG www.astaro.de Amalienbadstr. 36 • D-76227 Karlsruhe Monika Heidrich • Tel.: 0721 25516 0 Es scheint aber auch Institutionen zu geben, die dem „homo perligata“ nicht sehr wohl gesonnen sind. Wie ist es sonst zu e-mail web net security erklären, dass die gelben „Flitzer“ der Schneckenpost das eine Mal einen $foo-Leser finden und mal soll es den Leser

 Inhaltsverzei chnis

Allgemeines 06 Über die Autoren 52 Rezension - Intermediate Perl

Internes 08 //SEIBERT/MEDIA lässt das $foo-Gewand glänzen

Win32 10 ExcelPerl

Module 14 RegEx 18 Objektorientierung mit Moose 29 VOIP mit Net::Sip

Perl 32 Perl 6 Tutorial 36 Slices 38 HTML::Template::Compiled

Web 42 Caching in Webapplikationen 48 Sessions in IMPRESSUM Konferenz Smart Websolutions Windolph und Bäcker GbR Herausgeber: 50 YAPC::Europe 2007 in Wien Maria-Montessori-Str. 13 D-64584 Biebesheim Interview Redaktion: Renée Bäcker, Katrin Blechschmidt, André Windolph 53 André Mindermann über OTRS Anzeigen: Katrin Blechschmidt Layout: //SEIBERT/MEDIA Auflage: 500 Exemplare User-Gruppen Druck: powerdruck Druck- & VerlagsgesmbH 55 Ruhr.pm Wienerstraße 116 A-2483 Ebreichsdorf News ISSN Print: 1864-7537 26 CPAN News IV ISSN Online: 1864-7545 49 Podcasts Teil 4 57 Termine

55 LINKS Allgemeines

Martin Fabiani Martin Fabiani http://www.fabiani.net/ (33 Jahre alt) kommt aus Nordtirol, lebt und arbei- tet aber seit 1998 in Deutschland. Seit 1999 ist er freiberuflich als Perl-Entwickler und -Trainer tätig, und hat im Jahr 2000 über Perl das spannende Thema Metadirectories und Identity Über die Autoren Management entdeckt, wo man Perl hervorragend für Datensynchronisationen verwenden kann, vor allem bei größeren Datenmengen und komplexeren Synchronisationsalgorithmen, und somit auch für die teilautomatisierte Administration verbundener Systeme. In seiner Freizeit leitet er das Forum auf http://www.perl-community.de unter dem Pseudonym Strat und versucht, ein Mega-Synchronisationsframework für Perl mit Schnittstellen zu einer Menge verschiedener Datenhaltungssystemen zu entwickeln.

Renée Bäcker Tina Müller Seit 2002 begeisterter Perl-Programmierer und seit 2003 selbständig. Auf der Suche nach Tina Müller hat 1998 in einem Studentenjob Perl kennengelernt. Nachdem sie an der Uni- einem Perl-Magazin ist er nicht fündig geworden und hat so diese Zeitschrift herausgebracht. versität Miranda, Modula 2 und Java beigebracht bekam, war dies also ihre erste Sprache, In der Perl-Community ist Renée recht aktiv – als Moderator bei Perl-Community.de, Organi- die sie dank der Ausdrucksstärke und dem Do-What-I-Mean-Konzept begeistern konnte. sator des kleinen Frankfurt Perl-Community Workshop und Mitglied im Orga-Team des deut- Nach und nach lernte sie die Perl-Community kennen, also das Usenet, Webforen, die Kon- schen Perl-Workshops. ferenzen und Workshops, die Perl-Mongers, Perl-Golf usw. Während für sie so in privaten Projekten Perl nicht mehr wegzudenken ist, hat sie das Glück, auch im Beruf mit Perl zu programmieren, vornehmlich Backends für kleine und große Webseiten.

Herbert Breunung Ronnie Neumann Ein perlbegeisteter Programmierer aus dem wilden Osten, der eine Zeit lang auch Compu- Ronnie Neumann nutzt Perl seit seiner Zeit als System- und Netzwerkadministrator. Seit die- tervisualistik studiert hat, aber schon vorher ganz passabel programmieren konnte. Er ist ser Zeit ist er als User im Forum http://board.perl-comunity.de aktiv. Ronnie nutzt Perl für vor allem geistigem Wissen, den schönen Künsten und elektronischer sowie handgemach- administrative Tasks und Web-Anwendungsentwicklung. Seit einiger Zeit ist er als Lehrer ter Tanzmusik zugetan. Seit einigen Jahren schreibt er einen Texteditor in Perl für den noch für arbeitstechnische Fächer an einer Berufsschule in Frankfurt tätig und hat dort leider zu dringend ein Name gesucht wird und betätigt sich auch aktiv aus perl-community.de und der wenig Einsatzmöglichkeiten für Perl. Wikipedia wo er fast nur noch die Kategorie Programmiersprache Perl betreut.

Simon Betrang Steffen Ullrich Simon Bertrang ist als Entwickler für einen der großen Streaming-Provider tätig. Steffen Ullrich hat 18 Jahre Programmiererfahrung, davon Er verwendet Perl seit über 10 Jahren für einen nicht unbeträchtlichen Teil seiner Projekte die letzten 11 Jahre fast ausschließlich mit Perl. Er arbeitet zur Zeit bei der Firma GeNUA und Arbeiten. mbh (http://www.genua.de) was neben einer angenehmen, familienfreundlichen Arbeitsat- Als OpenBSD-Entwickler ist er unter anderem bemüht die Perl-Pakete auf dem neusten mosphäre auch ein Paradies für Perl-Entwickler ist. Er ist Autor und Maintainer von Net:: Stand zu halten und das Repertoire zu erweitern. SIP und Devel::TrackObjects sowie aktueller Maintainer von IO::Socket::SSL.

  Internes Internes

selnden frischen Farbgebung und dem Dromedar. Natürlich. Um die Sammelleidenschaft der Perl-Gemeinde auf ein Neu- es zu entfachen, erhält jede Ausgabe übrigens ihre ganz per- T/MEDIA sönliche Farbnote. In dieser Ausgabe ist es passenderweise // SEIBERT/MEDIA GmbH //SEIBER die Hausfarbe des „Malers“. Rheingau Palais Söhnleinstraße 8, 65201 Wiesbaden lässt das $foo-Gewand glänzen Perl ist Kult. Und $foo das dazugehörende Magazin. www.design.seibert-media.net

Es grüßen, die Design-Abteilung von //SEIBERT/MEDIA und Consulting / Technologies / Design ein paar stolze Perl-Programmierer. In der Tat war der Auftrag etwas außergewöhnlich: Europas Nachdem ja bereits einige Ausgaben existierten, waren die einziges Magazin in Sachen Perl-Programmierung sollte ein ersten Schritte zwar logisch, „lasst uns die Exemplare mal neues Design erhalten. Diesmal also kein Relaunch für eine richtig auseinandernehmen“, mitunter aber auch ziemlich Website, sondern für ein noch junges, wachsendes und hoch- verstörend: „Uiuiuiui, wie sieht das denn aus?“, erinnert sich karätiges Printprodukt – die Design-Abteilung der Wiesba- Martin Riekert an die Momente, in denen der Handlungsbe- dener Internet- und Werbeagentur //SEIBERT/MEDIA war darf besonders deutlich wurde. Das war’s dann allerdings begeistert. „Solche Aufträge sind für einen Grafiker natürlich schon mit dem Lamentieren, die Aufgabenstellung wurde eine wunderbare Sache, bei der man seine ganze Kreativität schließlich klar und deutlich formuliert: ins Spiel bringen kann“, freute sich Abteilungsleiter Martin Ausgabe 4/2007 – www.foo-magazin.de – 6,00 € Riekert über die Aufgabe für sein Team, das aus 6 Mitarbei- Folgende Werte sind zu berücksichtigen: vielfältig – einfach, tern besteht. Neben den bisherigen Kernbereichen Web-Tech- grenzenlos – individuell sowie modular – praktisch; dazu nologie, Online-Marketing und Consulting entwickeln sich Perl-Gemeinde, Kult-Magazin, Programmierung und Frei- die Designer im seit 1996 bestehenden Hause Seibert, das im- heit. Fünf Kategorien ergaben sich aus diesen Vorlagen, $fooPERL MAGAZIN merhin rund 60 Mitarbeiter beschäftigt, zu einem gefragten wir brauchen Partner. Ob großflächige Plakataktionen, die Gestaltung von langfristig angelegten Anzeigenkampagnen, komplette Pro- 1. ein modular erweiterbares Layoutsystem, dukteinführungen oder gerade aktuell der Entwurf eines 2. die Berücksichtigung der Einfachheit umfangreichen Wintersportkatalogs in zehntausendfacher und des Kultcharakters der Skriptsprache, Moose Objektorientierung mit Moose in Perl Auflage – längst ist es nicht mehr allein der Internetauftritt 3. eine junge, dynamische und humorvolle Bildsprache, Caching in Webapplikationen und die Web-Applikation mit der Perl-Programmierung im 4. ein funktionales und modernes Typokonzept, Das merk’ ich mir... Backend, die erfolgreich realisiert werden. 5. sowie eine individuelle Farbgestaltung je Magazin- VOIP mit Net::Sip Internettelefonie mit Perl ausgabe. Neu, schön und grün: $foo im neuen Design – was ab sofort für immer und nur heute anders ist. Vom Selfmade-Layout zum Kurz: Jede Ausgabe soll einzigartig sein! professionellen Kult-Magazin Da Perl (die größtmögliche Freiheit für Programmierer!) eine Letztendlich war es exakt jene Entwicklung, die das „$foo der ältesten etablierten Programmiersprachen überhaupt Perl-Magazin“ eine Anfrage Richtung Landeshauptstadt ist, wurde die Leitidee „Kult-Magazin“ für den Relaunch schicken ließ. Redakteur Renée Bäcker: als sehr passend empfunden. Der Kult-Gedanke sollte sich im gesamten Erscheinungsbild widerspiegeln: Flächen mit „Wir brauchen eine Leitidee, ein Kommunikationskonzept Rapport aus Kreisen wie auf 70er-Jahre-Tapeten wurden 01 Vorher 02 Nachher und eine grafische Realisierung, in der sich Perl und unsere eingesetzt, ebenso prägnante Balkenelemente, abgerundete Zeitschrift mit den entsprechenden Eigenschaften und Cha- Ecken sowie schräge Winkel verwendet. Der Charakter des 01 $foo-Magazin (Ausgabe 2, 2007) im alten Layout / funktional und puristisch rakteren optimal wiederfinden. Macht doch mal.“ Spontanen und Einzigartigen wird auf diese Art und Weise 02 $foo-Magazin (Ausgabe 4, 2007) nach dem Layout-Relaunch / individuell, jung, dynamisch, kultig bei jeder Ausgabe neu erlebt – inklusive einer ständig wech-

  Win32

Programmargumente parsen Neues ExcelPerl-Objekt erstellen und Excel-Datei öffnen Code aus dem optionalen Begin-Block ausführen Solange eine Zeile aus Excel gelesen werden kann: Tu das und stelle die Variablen @F, @C, $ _ und $. bereit Führe den im Argument -ane angegebenen Perl-Code auf die Zeile aus Code aus dem optionalen End-Block ausführen Perl + Excel + Kommandozeile = Fertig Listing 1 ExcelPerl Man soll Code vor und nach der Schleife ausführen können. Da Tie mit einem eigenen Namensraum glücklicher ist als Dafür sehe ich zwei weitere Programmparameter namens - mit einem geteilten, habe ich dafür ExcelPerl::RowArray begin und -end vor (ab V0.12). verwendet. Ich fügte diesen Namensraum ans Ende der Da- Motivation Vorteile tei ExcelPerl.pm ein, weil mir dafür eine weitere Datei nicht Ich will nicht nur an die Werte, sondern auch auf die Zellen- gerechtfertigt schien. Auf dem Frankfurter Perlmongers-Stammtisch hörte ich von · Direkte Änderungen an der Datei sind möglich (Werte, For- objekte direkt zugreifen. Ich habe mich dafür für ein Array XLSperl (http://perl.jonallen.info/projects/xlstools), mit mate, ...), ohne dass Informationen verloren gehen. namens @C entschieden, das die Zellen-Objekte der aktu- Aus dem Tie sind die folgenden Methoden interessant: dem man Excel-Dateien mit Perl-Einzeilern lesen kann. Diese · Zugriff auf die komplette Funktionalität der installierten ellen Zeile enthält. · TIEARRAY der Konstruktor, der das Objekt als Hashrefe- Idee gefiel mir, weil es einen Arbeitsschritt erspart, nämlich Excelversion. renz initialisiert das Speichern von Excel-Dateien im CSV-Format, bevor man · Der Benutzer hat die Wahl, ob und unter welchem Namen Die Funktionalität soll ein OOP-Modul werden, das von · STORE bekommt folgende Parameter: das Objekt, den In- Perl-Einzeiler darauf los lässt, und durch Verwendung des er die Änderungen speichern will. einem kleinen Hauptprogramm aufgerufen wird; vielleicht dex der Änderung und den neuen Wert. Wenn es sich um Moduls Spreadsheet::ParseExcel ist es ziemlich platt- · Ich kann weitere benötigte Features einbauen, die in XLS hat jemand mal Verwendung für das Modul. eine Änderung handelt, wird diese an Excel weitergereicht formunabhängig und benötigt auch kein installiertes Excel. perl (noch?) nicht vorhanden sind. und der Änderungszähler via C<$excelObj-E #!/usr/bin/ Wenn @F verändert wird, soll diese Änderung auch gleich in erhöht Ich verwende Perl-Einzeiler und Excel häufig zur Analyse die Excel-Datei geschrieben werden. Dafür bot sich entweder von irgendwelchen Daten oder zur Generierung von Test- eine Art Cleanup-Handler an, der mit dem Vergleichen und daten. Bei XLSperl störte mich jedoch, dass Excel-Dateien Nachteile aktualisieren loslegt, wenn @F aus dem Scope fällt, oder ein nur gelesen werden können, nicht aber verändert. Und bei Tie. Ich entschied mich für den Tie, weil ich so den größten Probleme und Lösungen dem Zwischenschritt CSV-Datei gehen eventuelle Formatie- · Läuft nur noch unter MS-Windows-Betriebssystemen Teil der Komplexität aus dem Hauptprogramm heraushalten rungen und Formeln verloren. Man kann zwar eine zweite · Benötigt Excel kann. Ein erster Prototyp war nach etwa zwei Stunden fertig. Er Excel-Datei via Spreadsheet::WriteExcel dranhängen, in die funktionierte, war aber so häßliche, dass ich nach besseren man die Datei Zelle für Zelle kopiert, aber das erschien mir Wegen suchte. Ich fragte auf http://board.perl-community. zu unhandlich und anfällig für verschiedene Verluste (die de und http://www.perlmonks.org/ um Rat, wenn mir kein Spreadsheet-Excel-Module decken ja den Funktionsumfang Grundsätzliche Ideen Planung sauberer Lösungsweg einfiel. von Excel nicht 100% ab). Die Verwendung sollte analog Perl-Einzeilern mit -ane funk- Mein Hauptprogramm soll in etwa aussehen wie in Listing 1 Vor allem pkai aus Darmstadt hatte ein paar tolle Verbesse- Ein weiterer möglicher Weg wäre, auf Excel-Dateien via tionieren, die Werte einer Zeile in einer Liste @F darstellen, dargesetellt. rungsvorschläge (Nochmals ein großes Dankeschön!). ODBC (z.B. via DBI und DBD::ODBC) zuzugreifen. Aber dieser und auch die Variablen $_ (= gesamte Zeile, gejoint durch ein Weg passte weniger zu meinen Vorstellungen, weil ich mehr Trennzeichen) und $. (=aktuelle Zeilennummer) sollen vor- Also begann ich mit dem OOP-Framework (siehe die Datei Verwendeten Datenbereich erkennen Kontrolle über Excel haben wollte als nur über die reinen Da- handen sein. ExcelPerl.pm). Die wichtigsten Teile sind die folgenden Me- Da ich keine brauchbare Excel-Methode fand, die mir den ten. Da ich mit Excel-OLE-Automationen schon ein wenig Er- thoden: verwendeten Bereich des Spreadsheets gab, ich aber nicht fahrung hatte, beschloss ich, mein eigenes XLSperl zu schrei- Ich will nicht nur an die Werte, sondern auch auf die Zellen- · new erzeugt ein neues Objekt immer über alle möglichen Zeilen iterieren wollte, war mein ben, das auf Win32::OLE basiert, und nannte es ExcelPerl. objekte direkt zugreifen. Ich habe mich dafür für ein Array · openöffnet die Excel-Datei via Win32::OLE erster Versuch, den verwendeten Bereich des Spreadsheets namens @C entschieden. · getNextRow liefert die nächste Zeile als tied Array @F über Leerzeilen zu erkennen (wenn mehr als n Leerzeilen in und die Objekte als @C zurück Folge kommen, muss dies das Ende sein). Hat zwar einiger- Man sollte angeben können, welches Worksheet man bear- · die folgenden Getter/Setter-Methoden: maßen funktioniert, war aber suboptimal. beiten will, und ab welcher Zeile man mit der Bearbeitung – currentRow: ist Basis für $. beginnen will, um so eventuelle Überschriften überspringen – changeCount hier wird festgehalten, ob Änderungen pkai fand die folgende Lösung (siehe Listing 2): zu können. an der Datei vorgenommen wurden – und weitere 10 11 $bottomRight = ( # wird bei Activestate automatisch geladen excelPerl.pl ^ split( /:/, use Win32; -ane “$x{$F[0]}++“ ^ $worksheet->UsedRange->address(0,0) ) # Fehlerbehandlung -end “use Data::Dumper; print Dumper \%x“ ^ Listing 8 )[-1]; defined( $file ) or die “Usage\n”; -f test.xls Listing 2 # Unwandlung $file = Win32::GetFullPathName( $file ); Das half mir schon eine Menge weiter, und machte das Pro- Listing 4 excelPerl.pl ^ -begin “use Text::CSV _ XS; $csv = Text::CSV _ XS->new( { binary => 1} )“ ^ gramm um einiges robuster und nebenbei auch schneller. -ane “$csv->combine(@F); print $csv->string, $/“ ^ Perl-Code wird für jede Zeile erneut evaluiert -f file.xls Listing 9 Tied Array aus Subroutine zurückgeben Wenn man was aus einer Subroutine zurückgibt, wird dies while( my @C = $excelPerl->getNextRow( \@F ) { # ... zuerst in eine interne Liste gespeichert (hier ist mal wieder eval $perlCode; der Unterschied zwischen Array und Liste deutlich zu seh- die $@ if $@; Listing 5 Spart manchmal ein klein wenig an Tipperei... Download von ExcelPerl } # while en), und dadurch verliert das Array natürlich alle Magie und somit auch den Tie. Über eine globale Variable wollte ich es Weitere Verwendungsbeispiele erhält man, wenn man http://www.fabiani.net/ -> Perl -> Downloads nicht lösen, weil da ja wieder der Variablenname sowohl Hier schug pkai vor, das eval vor die Schleife zu stellen und perldoc excelPerl.pl eingibt. im Hauptprogramm als auch in ->getNextRow bekannt sein eine anonyme Subroutine daraus zu machen (so wie bei XLS- # Martin Fabiani muss. Man kann @F zwar als Referenz zurückgeben, aber perl), und ich entwickelte (mit Vereinfachung von tinita) das dann könnte ich nicht mehr mit $F[0] arbeiten, sondern mit folgende Konstrukt (gekürzt): $F->[0], und ich wollte aber das Interface so weit wie möglich identisch zu perl -ane haben. Ich dachte über viele kompli- my $aneCode = eval <<‘EOM‘ . $perlCode . ‘;}‘;

zierte Sachen nach, fand heraus, dass sie nicht funktionieren sub { würden, und überlegte mir noch kompliziertere Sachen. Erst my $xlsPerl = shift; my $C = shift; nobull von den PerlMonks, die ich um Hilfe fragte, sagte mir, my @C = @$C; wenn ich es nicht rausbekommen könne, dann muss ich es # prepare some other helpful variables local $. = $xlsPerl->currentRow(); halt reinbekommen, und zwar mit Call-By-Reference (pein- no warnings ‘uninitialized‘; lich, daß es so einfach gehen kann und es mir nicht eingefal- local $ _ = join( $xlsPerl->colSeparator, @F len ist): ) . „\n“; EOM Listing 6 die $@ if $@; my @F = (); while( my @C = $excelPerl->getNextRow( \@F ) {

und in ExcelPerl.pm dann: So kann die Schleife jetzt ganz einfach aussehen, und läuft sub getNextRow { # $F ist Referenz auf @F nebenbei auch schneller: my( $self, $F ) = @ _ ; Perl-Bootcamp 2008 … tie( @$F, ‘ExcelPerl::RowArray’, $self ); while( my @cells = … $xlsPerl->getNextRow( \@F ) ) { In der Zeit vom 28. April bis zum 02. Mai 2008 findet im Bei dem Bootcamp werden folgende Themen behandelt: return @C; $aneCode->( $xlsPerl, \@cells ); } # getNextRow } # while Kloster Eberbach (in der Nähe von Wiesbaden) ein Perl- Listing 3 Listing 7 Bootcamp statt. Organisiert wird der Kurs von Big Nerd · Implementierung Objekt-Orientierter Konzepte in Perl Ranch Europe. Als Trainer wurde angeheuert, · Packages und Namensräume verwenden der an mehreren Perl-Büchern mitgeschrieben hat und · Referenzen und Gültigkeitsbereiche Excel braucht absoluten Dateinamen BEGIN- und END-Blöcke wären hilfreich vor kurzem sein neuestes Werk „Mastering Perl“ her- · Komplexe Datenstrukturen verändern $excel->Workbooks->Open( $file ) kann die Datei nur In der Version 0.12 habe ich zwei weitere Argumente hin- ausgebracht hat. Somit dürfte der Kurs auch etwas für · Erstellen von Modulen für den eigenen Bedarf finden, wenn man sie mit einem absoluten Pfad angibt. zugefügt mit Namen -begin und -end, mit der zwei optionale erfahrenere Perl-Programmierer ganz interessant sein · Perl-Code testen und debuggen Komfortabler ist jedoch, wenn der Dateiname beim Aufruf Codestrings übergeben werden können, die dann vor bzw. – wenn auch nicht ganz billig. · zu CPAN beitragen von ExcelPerl auch relativ angegeben werden kann, und nach der while-Schleife ausgeführt werden, sodass jetzt dann on-the-fly in einen absoluten verwandelt werden kann. auch folgende Konstrukte möglich sind (siehe Listing 8 und Weitere Informationen unter: Gottseidank gibt es aus dem Modul Win32 die Funktion Get- Listing 9). http://bignerdranch.com/classes/perl.shtml FullPathName für derartige Probleme, also (siehe Listing 4): # Renée Bäcker

12 13 Module

Der Reguläre Ausdruck, der von Regexp::Assemble erzeugt le my $x = $&; auskommentiert und die Aufrufe wiederholt wird, sieht so aus: (?-xism:Pe(?:lle|rl)) (siehe Listing 4).

Leider kann das Modul keine ‘UND‘ Verknüpfung, aber es ist So richtig benchmarken kann man das Problem nicht, da die trotzdem sehr hilfreich. Auch Buchstaben-Bereiche werden Auswirkungen auf die Laufzeit sehr stark vom Programm RegEx Module – von dem Modul nicht erkannt. Füttert man Regexp::Assemb- abhängen. Ein Programm mit sehr vielen Regulären Ausdrü- Zahme Regenechsen... le einzeln mit den Ziffern 1 bis 9, so macht es daraus den Re- cken hat natürlich wesentlich größere Laufzeitnachteile als gEx (?-xism:[123456789]) statt (?-xism:[1-9]). ein Programm mit sehr wenigen RegEx.

Ein weiteres Modul in diese Richtung ist Regex::PreSuf hat ein Modul geschrieben, das diesen Ge- schwindigkeitsnachteil zumindest auf den einen Regulären Reguläre Ausdrücke (RegEx) zählen eindeutig zu den Stärken Die Verwendung von Regexp::Common ist sehr einfach. Die Regexp::MatchContext Ausdruck begrenzt. Dazu muss in dem Regulären Ausdruck von Perl und man landet doch recht häufig bei diesem Mittel. Regulären Ausdrücke sind „hierarchisch“ in einem Hash ab- Gern verwendete Variablen bei Regulären Ausdrücke sind der Modifier (?p) verwendet werden. Ein Beispiel dazu ist Die RegEx können dabei recht verwirrend sein. gelegt. $`, $& und $‘ beziehungsweise deren langnamigen Pendants in Listing 5 zu sehen. Mit der Benutzung des Moduls gibt $PREMATCH, $MATCH und $POSTMATCH. Diese Variablen sind es erst einen Zeitvorteil wenn mehrere Reguläre Ausdrücke In diesem Artikel werden einige Module im Zusammenhang So sind unterhalb von $RE{num} alle Ausdrücke, die Zahlen hilfreich, aber sie haben einen ganz großen Nachteil: Die Re- verwendet werden, von denen nicht alle diese „Kontext“-Va- mit Regulären Ausdrücken gezeigt. Das geht von Modulen, behandeln, zu finden. Mit $RE{num}{int} bekommt man gulären Ausdrücke werden extrem langsam. Und das wirkt riablen verwenden. die dem Programmierer die Zusammenstellung der RegEx den Regulären Ausdruck für Integerzahlen. sich nicht nur auf den Regulären Ausdruck aus, in dem diese abnehmen bis hin zu Modulen, die bei der „Analyse“ von Re- Variablen verwendet werden, sondern auf alle RegEx im Pro- In Perl 5.10 braucht man das zusätzliche Modul nicht mehr. gulären Ausdrücken helfen. Ein kleines Beispiel, in dem Dezimalzahlen gesucht werden, grammlauf. Yves Orton hat dort den p-Modifier in die RegEx-Engine ein- ist in Listing 1 zu sehen. gebaut, die ähnlich wie Conways Modul bestimmte Variab- Tina Müller hat mal mit einem ganz einfachen Skript die Zei- len nur für den Regulären Ausdruck setzt, der das ausdrück- Regexp::Assemble tunterschiede verdeutlicht (Listing 3), danach wurde die Zei- lich anfordert (siehe auch $foo „Sommer 2007“). Heinzelmännchen für 1000 einzelne Regexes, doch wie kann man das zusammen- $ cat regex.pl Programmierer fassen? Die Lösung heißt Regexp::Assemble. Mit diesem #!/usr/bin/perl Modul können mehrere einzelne Reguläre Ausdrück mit use strict; Was passiert da eigentlich? use warnings; Regexp::Common “ODER‘ verknüpft werden. Das Modul macht dabei keine my $x = $&; Eine große Sammlung von „alltäglichen“ Regulären Ausdrü- sture Aneinanderreihung der Teile, sondern versucht „intel- my $string = “123“ x 1000; YAPE::Regexp::Explain for (0..100000) { cken wie IP-Adressen, Integer-Zahlen und anderes ist in Reg- ligent“ Schnittmengen zu finden und das Resultat als kom- if ($string =~ m/3/) { Reguläre Ausdrück sind teilweise verdammt schwer zu ver- exp::Common vereint. Durch einen einfachen Mechanismus pakten Ausdruck darzustellen. my $x = “matched“; stehen. Gerade Perl-Einsteiger schauen häufiger mal mit drei } können auch Plugins recht schnell geschrieben werden. Der } Fragezeichen im Gesicht auf ein Perl-Programm. „Was macht Vorteil der Sammlung gegenüber selbstgeschriebenen Aus- Wenn in einem String überprüft werden soll, ob er die Worte $ time perl regex.pl denn das da? Das ist ja total kryptisch.“ bekommt man dann

drücken liegt darin, dass Regexp::Common schon viel getes- „Perl“ oder „Pelle“ enthält, dann sieht das Skript so aus real 0m0.108s zu hören. In so einem Fall hilft YAPE::Regexp::Explain. Es tet wurde. (Listing 2): user 0m0.100s nimmt die RegEx auseinander und erläutert jeden Teil aus- sys 0m0.008s $ time perl regex.pl führlich. So bekommt man einen Eindruck davon, was der Reguläre Ausdruck überhaupt macht. real 0m0.107s user 0m0.104s #!/usr/bin/perl #!/usr/bin/perl sys 0m0.000s Listing 3 #!/usr/bin/perl

use strict; use Regexp::Assemble; use strict; use warnings; use warnings; use Regexp::Common; my @words = qw(Perl Pelle); $ time perl regex.pl use Regexp::MatchContext -vars; my $string = “Perl ist toll“; my @zahlen = qw(1.000 0.5 3 15 15e21); real 0m0.056s my $string = ‘Dies ist ein langer Text‘; my $re = Regexp::Assemble->new; user 0m0.052s $string =~ /(?p)lang/; for my $val ( @zahlen ){ $re->add($ _ ) for @words; sys 0m0.004s if( $val =~ /^$RE{num}{int}$/ ){ $ time perl regex.pl print qq~ print $val, “: yes\n“; print “yes\n“ if $string =~ /$re/; PREMATCH: $PREMATCH } real 0m0.055s MATCH: $MATCH } Listing 1 Listing 2 user 0m0.052s Listing 4 POSTMATCH: $POSTMATCH Listing 5 sys 0m0.004s ~;

14 15 Aber das Modul hilft natürlich nicht nur den Einsteigern son- Das Modul versucht nämlich aus dem Regulären Ausdruck dern auch „alten Hasen“. Ein einfaches Beispielprogramm ist einen Automaten zu erzeugen. Somit kann man auch „per in Listing 6 dargestellt Hand“ versuchen, zu einem gegebenen String nachzuvollzie- hen warum der RegEx einen Treffer erzeugt oder eben auch In der Ausgabe des Programms (siehe Listing 7) erkennt man, nicht. So kann man auch Personen, die mit Regulären Aus- wie das Modul die einzelnen Teile des Regulären Ausdrucks drücken nicht unbedingt etwas zu tun haben, die Ergebnisse erklärt. Dadurch ist es auch sehr gut dazu geeignet, die ver- näherbringen. schiedenen Konstrukte wie (?:) kennenzulernen. Durch die Einrückung der Erklärungen ist gut ersichtlich, zu Wer sich gut mit Interna auskennt, kann auch den in Perl ein- welchem Klammerpaar ein Teil des Ausdrucks gehört. gebauten RegEx-Debugger verwenden. Doch sehr vielen wird die Ausgabe nur wenig sagen. Der RegEx-Debugger ist wieder GraphViz::Regex ein Thema für sich. Eine graphische Ausgabe kann mit dem Modul GraphViz:: # Renée Bäcker Regex von Leon Brocard erzeugt werden. Das ist natürlich vor allem für Leute interessant, die in der Schule oder sonst- #!/usr/bin/perl wo schon etwas von „Automaten“ gehört haben. use strict; use warnings; use GraphViz::Regex; #!/usr/bin/perl

my $re = ‘\(([^\(]*?)\)‘; use strict; my $graph = GraphViz::Regex->new( $re ); use YAPE::Regex::Explain;

my $output = ‘regex.png‘; my $re = ‘\(([^\(]*?)\)‘; open my $fh, ‘>‘, $output or die $!; print YAPE::Regex::Explain->new($re)->explain; binmode $fh; Listing 6 print $fh $graph->as _ png; Listing 8 close $fh;

C:\Perl\FooMagazin>explain.pl The regular expression:

(?-imsx:\(([^\(]*?)\))

matches as follows:

NODE EXPLANATION ------(?-imsx: group, but do not capture (case-sensitive) (with ^ and $ matching normally) (with . not matching \n) (matching whitespace and # normally): ------\( ‘(‘ ------( group and capture to \1: ------[^\(]*? any character except: ‘\(‘ (0 or more times (matching the least amount possible)) ------) end of \1 ------\) ‘)‘ ------) end of grouping Listing 7 ------16 Module

Die Wetterdaten habe ich in die __DATA__ Sektion gepackt. delt. Genau diesen Sachverhalt können wir objektorientiert Dies gilt auch für die nachfolgenden Skripte, auch wenn es abbilden. Wir bilden also zwei Klassen: eine für Messwerte nicht jedesmal abgebildet ist. und eine für die Liste mit den Messwerten:

Ähnliche Lösungen haben ich und viele andere Administra- Die Klasse TemperatureProbe beinhaltet Attribute für Tag, Objektorientierung in Perl toren und Programmierer, schon dutzendfach entwickelt, maximale Temperatur, minimale Temperatur und die durch- mit Moose um z.B. Log-Dateien zu parsen. Zu Beginn wird ein Hash schnittliche Temperatur, die wir ebenfalls der Textdatei ent- definiert, wobei der Wert für die maximale Temperatur nehmen können – bis jetzt aber keine Verwendung dafür so gewählt ist, dass er weit außerhalb der zu erwartenden hatten. Ein weiterer Aspekt der Objektorientierung ist, das Messwerte liegt. Die while-Schleife iteriert über die einzel- Methoden mit den Objekten, bzw. der Klasse verbunden wer- nen Zeilen. Mit einem regulären Ausdruck wird überprüft, den können. Wir benötigen den Konstruktor new, sowie Me- Eine typische Problemstellung – Ich bin im Netz, auf der Webseite codekata.com, auf die Auf- ob es sich um eine Zeile mit Messwerten handelt. Dies wird thoden, die uns den Zugriff auf die Attribute erlauben, also klassisch gelöst gabenstellung gestoßen auf der Dave verschiedenste Pro- angenommen, wenn die Zeile, nach einigen Leerzeichen, day, max, min und avg. In Perl existiert zwar keine strenge grammieraufgaben präsentiert. mit einer Ziffern-Folge beginnt. Ist dies gegeben, wird über Kapselung, die uns zwingt auf die Attribute über Methoden Objektorientierung ist eine Technik, die jeder Programmie- einen weiteren regulären Ausdruck der Inhalt der Zeile auf zuzugreifen, aber es ist eine sinnvolle Vorgehensweise, die es rer in seinem Werkzeugkasten haben sollte. Nicht immer Es handelt sich um die Aufgabe, aus einer Textdatei mit den die drei Variablen $day, $max, und $min verteilt. Wenn die uns z.B. erlauben würde, notwendige Daten-Validierungen ist ein objektorientierter Ansatz aber auch der beste oder Wetterdaten eines Monats, den Tag zu suchen an dem die Temperaturabweichung kleiner ist, als die in dem zu Beginn vorzunehmen, worauf ich aber erstmal verzichten möchte. schnellste Weg ein Problem zu lösen. Temperaturabweichung zwischen maximaler und minima- des Skriptes definierten Hashs, werden dessen Werte über- In diesem Artikel, in dem es um die Möglichkeiten von OOP ler Tagestemperatur am geringsten ist. Hier jetzt eine perl- schrieben. Nach der Schleife wird der (erste) Tag aus dem Die Klasse TemperatureTable benötigt erstmal nur ein in Perl gehen soll, möchte ich mit einem Beispiel beginnen, typische Lösung, die ich für die Aufgabe entwickelt habe Hash ausgegeben, der im Monat die kleinste Differenz zwi- Attribut table, das eine Liste von Messwerten, der uns be- das sehr gut ohne Objektorientierung zu lösen ist. (siehe Listing 1) schen maximaler und minimaler Temperatur aufweist. kannten Objekte vom Typ TemperatureProbe beinhaltet. Wir benötigen im ersten Schritt drei Methoden, den Kons- Wie bereits zu Beginn des Artikels aufgeführt, ist diese Lö- truktor new, sowie eine Methode zum parsen einer Datei #!/usr/bin/perl sung ohne Objektorientierung sehr kompakt und in wenigen parse _ file, die als Argument ein filehandle erwartet, so- use strict; use warnings; Minuten entwickelt. Wieso also sollte man eine objektorien- wie die Methode get _ min _ spread _ day, die uns den ge- my %msdy = ( tierte Lösung anstreben? suchten Tag mit der geringsten Temperaturdifferenz liefert. ‘day‘ => 0, ‘max‘ => 1000, ‘min‘ => 0 Mit typischer Perl5 Objektorientierung sieht das Ganze dann ); z.B. so aus (siehe Listing 2). while( ){ Eine objektorientierte Lösung next unless /^\s*\d+/; Wenn man die Klassen außer Acht lässt, reduziert sich unser my ($day, $max , $min ) = /^\s*(\d+)\s*(\d+)\*?\s*(\d+)\*?/ ; Die obige Lösung ist straight-forward - sie löst das Problem Programm jetzt auf drei Zeilen: @msdy{‘day‘, ‘max‘, ‘min‘} = ( $day, $max, $min ) if $max - $min < $msdy{‘max‘} - $msdy{ ‘min‘ }; in wenigen Zeilen Perl. Sie kann aber auch für sonst nichts } verwendet werden. Oft ist das so völlig in Ordnung, wenn es my $table = TemperatureTable->new; $table->parse _ file(*DATA); print $msdy{‘day‘} . “\n“; um eine Einmal-Lösung – ein Wegwerf-Skript – geht. Wenn print $table->get _ min _ spread _ day . “\n“; wir über Objektorientierung sprechen, dann geht es primär _ _ DATA _ _ auch um die Wiederverwendbarkeit von Code. Es macht also Listing 3 MMU June 2002 Sinn objektorientierte Lösungen zu entwickeln, wenn es ab-

Dy MxT MnT AvT sehbar ist, dass uns die Problemstellung weiterhin aus ver- Diese Betrachtungsweise ist aber nur bedingt legitim, weil 1 88 59 74 schiedenen Perspektiven beschäftigen wird. Bevor wir aber die Klassen deutlich mehr Zeilen benötigen, als unser ur- 2 79 63 71 3 77 55 66 diesen nächsten Schritt tun, möchte ich erstmal eine objek- sprüngliches Skript. Was haben wir also gewonnen? Wir 4 77 59 68 torientierte Lösung der bekannten Problemstellung aufzei- haben jetzt eine vollständige Repräsentation der Tabelle 5 90 66 78 6 81 61 71 gen. als Objekt zur Verfügung. Wir können also problemlos wei- 7 73 57 65 tere Methoden der Klasse TemperatureTable hinzufügen. 8 75 54 65 9 86 32* 59 Wenn wir den Datensatz betrachten, können wir – der Wenn wir z.B. eine Methode get _ max _ spread _ day be- mo 82.9 60.5 71.7 Listing 1 menschliche Betrachter – erkennen, dass es um eine Liste/ nötigen, können wir sie einfach der Klasse hinzufügen. Tabelle von Temperatur-Messwerten bzw. Messungen han-

18 19 #!/usr/bin/perl if ($probe->max-$probe->min < $msdy{‘max‘} - $msdy{‘min‘}) { @msdy{‘day‘, ‘max‘, ‘min‘} = ($probe->day, $probe->max, $probe->min) use strict; } use warnings; } return $msdy{‘day‘}; use Data::Dumper; }

package TemperatureProbe; package main;

sub new { my $table = TemperatureTable->new; my $class = shift; $table->parse _ file(*DATA); my @probe = @ _ ; print $table->get _ min _ spread _ day . “\n“; my $self = { print Dumper $table; Fortsetzung Listing 2 day => $probe[0], max => $probe[1], min => $probe[2], avg => $probe[3], #!/usr/bin/perl }; return bless $self, $class; use strict; } use warnings;

sub day { package TemperatureProbe; my $self = shift; use Moose; $self->{‘day‘} = shift if @ _ ; return $self->{‘day‘} has ‘day‘ => ( isa => ‘Num‘, is => ‘rw‘ ); } has ‘max‘ => ( isa => ‘Num‘, is => ‘rw‘ ); has ‘min‘ => ( isa => ‘Num‘, is => ‘rw‘ ); sub max { has ‘avg‘ => ( isa => ‘Num‘, is => ‘rw‘ ); my $self = shift; $self->{‘max‘} = shift if @ _ ; package TemperatureTable; return $self->{‘max‘} use Moose; } has ‘table‘ => ( isa => ‘ArrayRef‘, is => ‘rw‘, default => sub { [] } ); sub min { my $self = shift; sub parse _ file { $self->{‘min‘} = shift if @ _ ; my $self = shift; return $self->{‘min‘} my $fh = shift or die “parse _ file() needs a filehandle to parse on.“; } while (<$fh>) { next unless /^\s*\d+/; sub avg { my ($day, $max, $min, $avg) = /^\s*(\d+)\s*(\d+)\*?\s*(\d+)\*?\s*(\d+)/; my $self = shift; my $current = TemperatureProbe->new( $self->{‘avg‘} = shift if @ _ ; day => $day, return $self->{‘avg‘} max => $max, } min => $min, avg => $avg package TemperatureTable; ); push @{$self->table}, $current; sub new { } my $class = shift; } my $self = { table => [] }; return bless $self, $class; sub get _ min _ spread _ day { } my $self = shift; my %msdy = ( ‘day‘ => 0, ‘max‘ => 1000, ‘min‘ => 0 ); sub parse _ file { for my $probe (@{$self->{table}}) { my $self = shift; if ($probe->max - $probe->min < $msdy{‘max‘} - $msdy{‘min‘}) { my $fh = shift or die “parse _ file() needs a filehandle to parse on.“; @msdy{‘day‘, ‘max‘, ‘min‘} = ($probe->day, $probe->max, $probe->min) while (<$fh>) { } next unless /^\s*\d+/; } my ($day, $max, $min, $avg) = /^\s*(\d+)\s*(\d+)\*?\s*(\d+)\*?\s*(\d+)/; return $msdy{‘day‘}; my $current = TemperatureProbe->new($day, $max, $min, $avg); } push @{$self->{table}}, $current; } package main; } my $table = TemperatureTable->new; sub get _ min _ spread _ day { $table->parse _ file(*DATA); my $self = shift; my %msdy = ( ‘day‘ => 0, ‘max‘ => 1000, ‘min‘ => 0 ); Listing 2 print $table->get _ min _ spread _ day . “\n“; Listing 4 for my $probe (@{$self->{table}}) {

20 21 Unser erstes Skript hätten wir dazu komplett umschreiben dern wollen, dann wäre auch is => ‘ro‘ möglich gewesen, Rollenspiele durch die Zeile requires ‘ _ as _ aoa‘; mit dem Keyword müssen. Bevor wir uns aber um weitere Methoden Gedanken wobei readonly-Attribute erzeugt würden. requires definiert. Danach folgt die konkrete Methode to _ machen, stellt sich die Frage: Geht das alles auch mit weniger Wir haben aber auch die Möglichkeit gleich einen Typ für das Wir haben jetzt die Möglichkeit die Klassen um beliebige Me- html(), um die jede Klasse erweitert wird, die über die ge- Tipp-Aufwand für Konstruktoren und Accessoren? Objektattribut anzugeben. Das mag dem einen oder anderen thoden zu erweitern, je nachdem welche Funktionalität wir forderte Methode ein Array_of_Arrays zur Verfügung stellt, Leser merkwürdig vorkommen, da Perl 5 gar keine Typisie- benötigen. Wir könnten z.B. eine Klasse von Temperature- sprich eine simple Tabelle. Die Methode to _ html() ist da- rung kennt. Aber Moose kennt Typisierung, die sich an dem Table erben lassen, die mit der europäischen Celcius-Skala bei nur ein simpler Wrapper für das CPAN-Modul HTML:: orientiert was mit Perl 6 auf uns zukommt. In einem nach- arbeitet o.ä., wobei wir uns im bekannten Rahmen des objek- Table. Genauso wäre es aber auch möglich eine Role zu defi- Der Ritt auf dem Elch! folgenden Beispiel werde ich noch auf die Möglichkeit der torientierten Paradigmas bewegen würden. nieren die Text::ASCIITable verwendet, oder eines der CSV- Subtypisierung eingehen. Im obigen Beispiel ist als Typ für Module etc. - wobei jedes als Role in jede beliebige Klasse ein- Im CPAN finden sich mittlerweile einige Module, die dem ge- alle Attribute isa => ‘Num‘ angegeben, d.h. das nur nume- Häufig benötigen wir aber wiederkehrende Funktionalität gebunden werden könnte, die die Methode _ as _ aoa() zur neigten Programmierer die OO-Programmierung in Perl ver- rische Werte für die Attribute akzeptiert werden. in unseren Programmen, wie z.B. die Ausgabe von Daten als Verfügung stellt. Wir erreichen so also eine deutlich höhere einfachen können. Ich möchte in diesem Artikel auf Moose HTML-Tabelle, oder als ASCII-Tabelle, oder als (...). An diesen Wiederverwendbarkeit von Programmcode. eingehen, das vieles vom kommenden Perl 6 bereits heute Stellen greifen wir natürlich auf CPAN-Module zurück, die in Perl 5 ermöglicht. Bevor ich die einzelnen Features disku- uns die Arbeit erleichtern, trotzdem schreiben wir jede Men- Hier möchte ich noch eine klare Abgrenzung zu den in Java tiere, möchte ich erstmal die an Moose angepasste Variante Änderungen an TemperatureTable ge Methoden, die immer wieder fast das selbe tun. Alternativ verwendeten Interfaces machen. Interfaces sind rein abs- des obigen Skriptes präsentieren (siehe Listing 4). können wir eine Klasse schreiben, von der wir die benötigten trakt und erzwingen die konkrete Implementierung der ge- Auch in der Klasse TemperatureTable verwenden wir die Methoden erben würden. Mit Moose und dem kommenden wünschten Methode in jeder einzelnen Klasse. Zumal sie ein Attributsdefinition von Moose via Perl 6 steht uns aber noch eine andere Möglichkeit zur Ver- Kunstgriff sind, da Java keine Mehrfachvererbung kennt. fügung: Roles. Roles hingegen beinhalten die konkrete Implementierung Änderungen an TemperatureProbe has ‘table‘ => ( isa => ‘ArrayRef‘, der gewünschten Methode, erwarten also nur das ihnen is => ‘rw‘, default => sub { [] } ); Roles erweitern Klassen auf Basis einer „was kannst du“-Fra- auf einem vereinbarten Weg, in unserem Fall die Methode Die Klasse TemperatureProbe ist auf fünf Zeilen reduziert ge, nicht der in der klassischen Objektorientierung üblichen _ as _ aoa(), die benötigten Daten zur Verfügung gestellt worden, bei der Klasse TemperatureTable ist der Kons- Als Typ geben wir eine Referenz auf ein anonymes Array an. „wer bist du“-Frage. Die Kenner von Ruby kennen dieses werden truktor verschwunden. Konzentrieren wir uns zuerst auf die Hier sehen wir auch ein weiteres Feature von Moose, für die Konzept bereits von den dort existierenden Mixins. Klassen Änderungen an TemperatureProbe: Definition von Attributen: Wir können einen default-Wert werden um Methoden erweitert, in dem sie auf bestimmte Die Implementierung in die ursprünglische Klasse wollen angeben. In diesem speziellen Fall benötigen wir dazu eine Methoden-Aufrufe reagieren können müssen. Ich möchte wir uns abschließend betrachten (siehe Listing 8). In der ersten Zeile unter der package-Deklaration wird anonyme Subroutine. Wenn es sich um einen skalaren Wert das am Beispiel konkretisieren (siehe Listing 7). Moose mit use eingebunden. Danach werden nur noch die handelt, kann dieser direkt per default übergeben werden. Zu Beginn der Klasse TemperatureTable erfolgt die Einbin- benötigten Attribute definiert: Ansonsten ist es notwendig, den default-Wert über eine Co- Als ein Beispiel für eine solche Role ist die obige Role _ dung der gewünschten Roles mit dem Keyword with: dereferenz zu erzeugen. HTML _ Table zu sehen. Sie benötigt in jeder Klasse die sie has ‘day‘ => ( isa => ‘Num‘, is => ‘rw‘ ); einbinden möchte, die Methode _ as _ aoa(). Dies wird with ‘Role _ HTML _ Table‘; has ‘max‘ => ( isa => ‘Num‘, is => ‘rw‘ ); with ‘Role _ ASCII _ Table‘; Eine weitere Änderung ergibt sich in der Methode parse _ has ‘min‘ => ( isa => ‘Num‘, is => ‘rw‘ ); has ‘avg‘ => ( isa => ‘Num‘, is => ‘rw‘ ); Listing 5 my $current = TemperatureProbe->new( Gegen Ende der Klasse sehen wir die geforderte Methode day => $day, package Role _ HTML _ Table; _ as _ aoa() max => $max, , die wir als Vorraussetzung für die Einbindung

mit has ‘attribut‘ wird das jeweilige Attribut des Ob- min => $min, der Role definiert haben. Sie macht wirklich nichts anderes use Moose::Role; avg => $avg => ( isa => ‘Num‘, is => ‘rw‘ ); use HTML::Table; jektes bezeichnet, mit ); Listing 6 als eine einfache Tabelle als Array_of_Arrays zu erstellen welche Eigenschaften das Objekt besitzt. Das tolle an Moose und zurückzugeben. requires ‘ _ as _ aoa‘; ist, dass mit dieser Definition das wesentliche erledigt ist. file bei der Erstellung der TemperatureProbe-Objekte: sub to _ html { Moose baut für uns den Konstruktor new, den wir wie ge- Der selbsterstellte Konstruktor im ersten OOP-Beispiel er- Wenn wir uns nun das Ende des Skriptes betrachten, seh- my $self = shift; wohnt verwenden können, sowie auch Accessor-Methoden, wartete eine geordnete Liste mit den Werten für die vier At- my $table = HTML::Table->new( en wir, dass der Aufruf der Methode to _ html() genauso die uns den Zugriff auf die Objekteigenschaften erlauben. tribute. Der von Moose für uns erzeugte Konstruktor erwar- -class=>‘emb _ table‘, erfolgt, als wäre die Methode in der Klasse selbst definiert, -evenrowclass=>‘even‘, tet eine Liste mit Schlüssel-/Wert-Paaren. -oddrowclass=>‘odd‘, oder geerbt: -data => $self-> _ as _ aoa Bei der Definition der Attribute würde im einfachsten Fallis ); => ‘rw‘ genügen. Wenn wir sicher sind, dass wir die Attri- Die notwendigen Anpassungen in der Methode parse _ file return $table->getTable; } bute eines Objektes nach der Erzeugung nicht mehr verän- sind minimal und erhöhen darüberhinaus die Lesbarkeit des Listing 7 print $table->to _ html; Programmes.

22 23 #!/usr/bin/perl Zu guter Letzt: Einschränkungen Eine weitere Verwendung von Moose::Util::TypeCons-

use strict; traints findet sich in der Klasse TemperatureTable (siehe use warnings; Ich sehe schon das erste Stirnrunzeln bei dieser Überschrift. Listing 9).

package TemperatureProbe; Ja, es gibt auch Einschränkungen. Und zur Abwechslung mal use Moose; im besten Sinne. Denn Moose erlaubt die Verwendung von Hier wird ein Subtype ProbeList definiert, bei dem es sich um use Moose::Util::TypeConstraints; Constraints, die es uns erlauben sehr genau zu sagen was ein eine Referenz auf ein Array handelt, mit der Einschränkung, subtype Day Attribut sein kann – und was nicht. Im obigen Skript habe dass jedes Element der Liste ein Objekt vom Typ Tempera- => as Num => where { $ _ >= 1 and $ _ <= 31 }; ich dieses Feature bereits stellenweise verwendet, wie dem tureProbe sein muss. Wenn dies nicht zutrifft, bricht die aufmerksamen Leser nicht entgangen sein dürfte. anonyme Subroutine einfach ab. Läuft die Schleife komplett has ‘day‘ => ( isa => ‘Day‘, is => ‘rw‘ ); has ‘max‘ => ( isa => ‘Num‘, is => ‘rw‘ ); durch, wird 1 zurückgegeben, was den Test als erfolgreich has ‘min‘ => ( isa => ‘Num‘, is => ‘rw‘ ); Im Vergleich zur strengen Typisierung erlaubt uns Moose via verlaufen rückmeldet. has ‘avg‘ => ( isa => ‘Num‘, is => ‘rw‘ ); use Moose::Util::TypeConstraints; sehr genau zu defi- package TemperatureTable; nieren, wie wir uns einen subtype vorstellen. In der Klasse Zu guter Letzt bleibt mir nur den Autoren des Moduls Moose use Moose; use Moose::Util::TypeConstraints; TemperaturProbe sehen wir ein recht einfaches Beispiel, zu danken, die Perl5 schon heute ein wenig näher an die Mög- wo ein Subtype für das Attribut ‘day‘ definiert wird: lichkeiten von Perl6 bringen und uns Programmierern ein with ‘Role _ HTML _ Table‘; Werkzeug an die Hand geben, das die Arbeit mit objektorien- with ‘Role _ ASCII _ Table‘; subtype Day => as Num tiertem Perl deutlich angenehmer und effizienter gestaltet. subtype ProbeList => as ArrayRef => where { => where { $ _ >= 1 and $ _ <= 31 }; ( blessed($ _ ) && $ _ ->isa(‘TemperatureProbe‘) || return ) for @$ _ ; 1 has ‘day‘ => ( isa => ‘Day‘, is => ‘rw‘ ); }; Moose ist darüber hinaus hervorragend im CPAN doku-

has ‘table‘ => ( isa => ‘ProbeList‘, is => ‘rw‘, default => sub { [] } ); mentiert – insbesondere existiert ein ausführliches Koch- Der Subtype ‘Day‘ wird als numerischer Wert definiert, mit buch unter Moose::Cookbook, dass in mehreren Schritten sub parse _ file { my $self = shift; der Einschränkung, dass der Wert größer/gleich 1 sein muss die Möglichkeiten von Moose beleuchtet und dabei über die my $fh = shift or die “parse _ file() needs a filehandle to parse on.“; und kleiner/gleich 31 ist. Entsprechend könnten wir auch ei- Möglichkeiten dieses Artikel weit hinausgeht. while (<$fh>) { next unless /^\s*\d+/; nen Subtype für die Temperaturen definieren, die sich auch my ($day, $max, $min, $avg) = /^\s*(\d+)\s*(\d+)\*?\s*(\d+)\*?\s*(\d+)/; in einem bestimmten Bereich bewegen dürfen etc. # Ronnie Neumann my $current = TemperatureProbe->new( day => $day, max => $max, min => $min, avg => $avg subtype ProbeList => as ArrayRef => where { ); ( blessed($ _ ) && $ _ ->isa(‘TemperatureProbe‘) || return ) for @$ _ ; 1 push @{$self->table}, $current; }; } has ‘table‘ => ( isa => ‘ProbeList‘, is => ‘rw‘, default => sub { [] } ); } Listing 9

sub get _ min _ spread _ day { my $self = shift; my %msdy = ( ‘day‘ => 0, ‘max‘ => 1000, ‘min‘ => 0 ); for my $probe (@{$self->{table}}) { if ($probe->max - $probe->min < $msdy{‘max‘} - $msdy{‘min‘}) { PM News: Ruhr.pm startet Jobbörse @msdy{‘day‘, ‘max‘, ‘min‘} = ($probe->day, $probe->max, $probe->min) } } Die Perlmonger-Gruppe von der Ruhr hat eine Jobbörse auf ihrer Homepage veröffentlicht. Darin ist eine Umkreis- return $msdy{‘day‘}; } suche auf Basis der eingegebenen Postleitzahl enthalten. Zur Zeit ist der Schwerpunkt der Jobbörse noch das Ruhrge- biet, aber das könnte sich bald ändern.

sub _ as _ aoa { ker c

my $self = shift; i return [ map { [ $ _ ->day, $ _ ->max, $ _ ->min, $ _ ->avg ] } @{$self->table} ]; } Grant für MediaWiki-Parser package main; TPF-T

my $table = TemperatureTable->new; Shlomi Fish hat erneut einen Grant von der erhalten. Die Förderung ist für ein Modul, mit dem Texte $table->parse _ file(*DATA); in MediaWiki-Syntax geparst werden können. Weiterhin muss Fish ein Kwiki-Plugin schreiben, mit dem Kwiki-Sei-

print $table->get _ min _ spread _ day . “\n“; ten auch mit MediaWiki-Syntax geschrieben werden können. # print $table->to _ html; Listing 8 print $table->to _ ascii _ table;

24 25 News

CPAN News IV

WebService::Validator::HTML::W3C JavaScript::Writer use WebService::Validator::HTML::W3C; use JavaScript::Writer;

Für Webentwickler dürfte dieses Modul ziemlich interessant my $uri = ‘http://foo-magazin.de‘; Mit JavaScript::Writer kann man JavaScript aus einem Perl- my $js = JavaScript::Writer->new; my $validator = WebService::Validator::HTML:: my $f = $js->function(\&create _ js _ func- sein: WebService::Validator::HTML::W3C. Damit ist es mög- W3C->new( Programm heraus erzeugen. Das Modul ist wohl noch ganz tion); lich, den W3C-Validator in das eigene Perl-Programm einzu- detailed => 1, am Anfang seiner Entwicklung, denn es hat noch ein paar print $f->as _ string; ); bauen. So kann bei der Entwicklung von Webanwendungen Defizite. Aber es ist ganz praktisch, wenn JavaScript „on-the- sub create _ js _ function{ von Anfang an darauf geachtet werden, dass das HTML W3C- if( $validator->validate( $uri ) ){ fly“ erzeugt werden soll. Ganz ohne JavaScript-Kenntnisse my ($js) = @ _ ; if( not $validator->is _ valid ){ valide ist. my %hash; kommt man in der Regel aber nicht aus, da man Funktionen $js->var( ‘test‘, ‘$foo - Perl-Magazin‘ ); for my $error ( @{$validator->errors} ) { kennen muss und noch einiges mehr. $js->var( ‘i‘, 10 ); $hash{ $error->msg }++; $js->if( ‘i < 20‘, sub{ Man kann die Ausgabe an eigene Bedürfnisse anpassen... } Einige Funktionalitäten fehlen noch beziehungsweise müs- shift->alert(‘Kleiner als 20‘) } ); sen in der Dokumentation eingetragen werden. Wenn sich $js->else(sub{ for my $key ( sort keys %hash ){ shift->alert( ‘Groesser als 20‘) } ); Die Option „detailed“ muss auf „true“ gesetzt werden, wenn my $err = $hash{$key}; das Modul weiterentwickelt, ist es sicherlich irgendwann } später im Programm die errors-Funktion verwendet werden print sprintf “%dx %s\n“, $err, $key; sehr gut für Code-Generierung geeignet. } soll, weil nur dann die einzelnen Fehlermeldungen gespei- } chert werden. }

Dir::Self Acme::Pythonic #!/usr/bin/perl use Acme::Pythonic;

Wer kennt sie nicht, die Variablen __FILE__ und __LINE__? use strict; Oft wird Perl mit Python verglichen und die Python-An- my $test = ‘hallo welt‘ use warnings; my $i = 10 Dir::Self führt eine weitere solche Variable ein: __DIR__. use Dir::Self; hänger schwören auf die Möglichkeit, Semikolons und ge- Damit bekommt man den Pfad zum Verzeichnis, in dem die schweifte Klammern wegzulassen. Wer dies in Perl vermisst if $i < 10: print “Hauptskript ist im Verzeichnis “, print “\$i ist kleiner als 10\n“ Sourcen liegen. Der große Unterschied zu FindBin besteht _ _ DIR _ _ ,“\n“; und diese Python-Art in seine Programme einfließen lassen print $test,“\n“ darin, dass Module den Pfad zum eigenen Verzeichnis be- will, kann mit Acme::Pythonic arbeiten. Alles was nach der require Test::Package; hallo( $test ) kommen, während $FindBin::Bin den Verzeichnisnamen lie- Anweisung use Acme::Pythonic steht, kann ohne Semikolon fert, in dem das aufgerufene Skript liegt. und Block-Klammern geschrieben werden. sub hallo: package Test::Package; $test =~ s/welt/\$foo/ Insgesamt ist das Modul eher als „Spass“ zu sehen, aber es ist print $test,“\n“ use strict; mal ganz nett um ein Gefühl für die Pythonschreibweise zu use warnings; use Dir::Self; bekommen.

print “TestPackage ist im Verzeichnis “, _ _ DIR _ _ ,“\n“;

1;

26 27 Module

VoIP mit Net::SIP

Geo::GoogleEarth::Document Was ist SIP Was kann Net::SIP use Geo::GoogleEarth::Document;

GoogleEarth bietet – über Dateien im KML-Format – die Mög- my %placemarks = ( SIP ist der IETF Standard für VoIP, d.h. Telefonie etc über Net::SIP implementiert ausschließlich SIP, sowie die für SIP ‘Commerzbank-Arena‘ => { lichkeit, Informationen über bestimmte Orte zu speichern. lat => 50.06874400, Internet. Daneben gibt es noch den H.323 Standard von der notwendigen Teile von SDP. Es gibt eine minimale Imple- Diese Dateien können dann in GoogleEarth oder GoogleMaps lon => 8.64524200 ITU und das proprietäre Skype. SIP ist in Deutschland inzwi- mentation, um RTP Daten zu übermitteln. Es implementiert }, eingebunden werden. So kann man zum Beispiel eine KML- ‘Bruchweg-Stadion‘ => { schen stark verbreitet, meist von den Kunden direkt mittels keine Schnittstelle zu Sprach- oder Videodaten, d.h. mit Net:: Datei mit interessanten Punkten vom Urlaub anfertigen und lat => 50.0009717881533, Routern wie Fritz!BoxFON oder transparent für den Kunden SIP alleine ist es nicht möglich ein SIP Telefon zu erstellen. lon => 8.245587306186593, seinen Freunden weitergeben, damit diese wissen, wo sie im }, in sogenannten NGN (New Generation Networks). nächsten Urlaub hinfahren sollten. Oder man kann die Fuss- ); Man kann jedoch Net::SIP nutzen um z.B.:

ball-Stadien der Umgebung auflisten. my $doc = Geo::GoogleEarth::Document->new; SIP beschreibt ausschließlich die Verbindung. Der Transport der Nutzdaten (Sprache, Video...) erfolgt i.A. über RTP. Über · Jemanden anrufen und vorgefertige RTP Daten verschi- for my $place ( keys %placemarks ){ $doc->Placemark( SIP tauschen die Gegenstellen SDP Pakete aus, um die End- cken. Sinnvoll für automatische Ansagen (für die es hof- name => $place, punkte für den Transport der Nutzdaten festzulegen. fentlich auch Nutzung außer Werbung gibt). %{ $placemarks{$place} }, ); } SIP selber ist ein umfangreiches Protokoll. Die aktuelle Versi- · Anrufe entgegennehmen und mit vorgefertigten Ansagen

print $doc->render; on ist definiert in RFC3261, zur Telefonie sind aber noch min- beantworten (z.B bei Anruf Podcast), dabei evtl. Sprach- destens RFC2327 und RFC3264 zu verstehen, welche die Her- daten der Gegenstelle speichern (Anrufbeantworter). stellung von Datenverbindungen mittels SDP beschreiben. Weiterhin gibt es viele Erweiterungen, Auslegungen etc, die · Verbindungen mit externen RTP Quellen vermitteln (z.B. in vielen weiteren RFCs beschrieben sind. bei Anruf wird Verbindung zu Internetradio hergestellt).

App::Grepl use App::Grepl; Hier ist u.U. jedoch ein Programm nötig, welches die Codes use Dir::Self; angleicht.

In welchem Skript geht es um die „Commerzbank-Arena“? my $grep = App::Grepl->new({ App::Grepl liefert die Möglichkeit, in bestimmten Pro- dir => _ _ DIR _ _ , Was ist Net::SIP · Verbindungen zwischen 2 SIP Parteien aufbauen (3pcc, d.h. look _ for => [ ‘pod‘ ], grammbereichen nach Pattern zu suchen. Dabei kann an- pattern => qr/Commerzbank-Arena/, 3rd Party Call Control). gegeben werden, welche Bereiche berücksichtigt werden }); Net::SIP ist eine Sammlung von Modulen, um in Perl mit SIP

sollen. Möglich ist es, in der Dokumentation, in Heredocs, $grep->search; arbeiten zu können. Es läuft auf perl5.8 und perl5.9. Einzige · Nachrichten verschicken (SMS), sofern das SIP Endgerät Strings und Kommentaren zu suchen. Abhängigkeit außer den CORE Modulen ist Net::DNS. über entsprechende Möglichkeiten verfügt. Das Ergebnis ist ganz interessant wenn man das Bei- spielskript auf den CPAN_News-Ordner der Beispielcodes Net::SIP ist entstanden im Zusammenhang mit der Imple- · VoIP/SIP über Firewalls hinweg vermitteln durch Umschrei- dieser $foo-Ausgabe anwendet. Im zweiten Durchlauf nicht mentation eines VoIP/SIP Gateways für das GeNUGate Hoch- ben der SIP/SDP Pakete und Transport der RTP Daten. nur in ‘pod‘, sondern auch in ‘quote‘ suchen lassen... sicherheitsfirewall Produkt (siehe http://www.genua.de). · Aufbau einer einfachen SIP Zentrale mit Registrar und Pro- xy, an die die SIP Telefone angeschlossen werden. Mit Perl kann man dann komfortabel (zumindest das, was Perl Pro- grammierer als komfortabel empfinden) Policies z.B. basie-

28 29 rend auf der Nummer der Gegenstelle implementieren, d.h. mentiert ist. Allerdings ist eine eventbasierte Arbeitsweise Wie kann ich helfen Weitere Informationen Anrufe blockieren, an mehrere Telefone weiterleiten, auf An- für einfache Aufgaben zu umständlich. rufbeantworter lenken, mit einer bestimmten Ansage verse- Daher gibt es als oberste Ebene Net::SIP::Simple, welches Die beste Hilfe ist momentan, Net::SIP zu nutzen und da- Ich habe versucht, die Dokumentation zum Module ausführ- hen etc. Auch Warteschleifenmusik sollte gehen. ein einfaches Interface für Standardaufgaben (anrufen, An- durch Schwachstellen der Implementierung bzw. Dokumen- lich zu machen (wobei man wohl nie genug Dokumentation ruf annehmen, Registrar bauen...) bereitstellt und auch über tation oder Probleme bei der Zusammenarbeit mit bestimm- haben kann). Weiterhin sind in der Distribution Beispiele Man kann mit den Mitteln von Net::SIP jedoch keine Um- eine einfache Implementation zum Versenden und Empfan- ten SIP Gegenstellen aufzudecken. und funktionierende Applikationen für Anrufen, Anrufe wandlung von Codecs, Mixen von Sprachdaten (für Konferenz- gen von RTP Daten verfügt. Damit lassen sich prima Tests entgegennehmen, 3rd Party Call Control, Anrufbeantworter anrufe) o.ä. vornehmen, wie es z.B Asterisk kann. Auch die schreiben (was der primäre Zweck war), es ist jedoch auch Ansonsten freue ich mich über sinnvolle Beispiele und auch und ein Proxy, der SIP über einen Firewall transportiert. Di- Reaktion auf Usereingaben über die Tastatur (DTMF) bleibt leistungsfähig genug für komplexere Applikationen. über Links zu Projekten, die Net::SIP nutzen. Beides kann ich ese Beispiele werden bei der Installation des Modules nicht Asterisk vorbehalten. Es ist jedoch möglich, Anrufe nach in dann zum Projekt hinzufügen, um damit die Dokumentation mit installiert, sind aber z.B. sichtbar auf (http://search. Perl implementierten Kriterien an den Asterisk SIP Proxy wei- und Motivation insbesondere für Neueinsteiger zu erhöhen. .org/src/SULLR/Net-SIP-0.37/) terzuleiten. Und außerdem würde ich sehen, was ich auf keinen Fall än- Weiterhin stehe ich gerne für Nachfragen, Problem- und Beispiele dern darf, um Euren Code nicht zu brechen. Bugreports zu Verfügung und beantworte entsprechende Momentan hat Net::SIP Unterstützung für SIP über UDP und Mails normalerweise innerhalb von wenigen Tagen. IPv4. Unterstützung für SIP über TCP ist praktisch nichts ge- Die *.raw Dateien in den Beispielen sind mit dem PCMU/8000 testet, SIPS (verschlüsselt) ist nicht unterstützt. Nicht unter- Codec codierte Dateien - das ist das einzige Format was die # Steffen Ullrich stützt ist auch IPv6. In der Praxis sollten diese Limitierungen simple RTP Implementation zur Zeit empfangen und ver- z.Z. kein Problem darstellen, da SIP fast ausschließlich über schicken kann.Wandeln kann man solche Dateien mit sox, use strict; use Net::SIP; UDP/IPv4 benutzt wird. z.B.siehe Listing 1. my $ua = Net::SIP::Simple->new( leg => ‘192.168.178.2:5060’ ); $ua->create _ chain([ $ua->create _ registrar, Ein Proxy mit Registrarfunktion $ua->create _ stateless _ proxy, Dieses Beispiel ist ein Proxy, bei dem man sich auch regis- ]); Listing 2 $ua->loop; Struktur von Net::SIP trieren kann. Wenn ein neuer Anruf reinkommt, wird zuerst geschaut, ob die Zieladresse lokal registriert ist und dann zu use strict; Auf der untersten Ebene sind die Klassen zur Verarbeitung dieser vermittelt, ansonsten der Anruf nach außen weiter- use Net::SIP; der SIP Pakete, d.h. Net::SIP::Packet und die Spezialisierungen vermittelt (siehe Listing 2). my $ua = Net::SIP::Simple->new( from => ‘sip:[email protected]‘, Net::SIP::Request und L. leg => ‘192.168.178.3:5060‘, Genau einen Anruf entgegennehmen registrar => ‘192.168.178.2:5060‘, ); Darauf aufbauend implementiert Net::SIP::Endpoint eine SIP Das Programm in Listing 3 registriert sich an dem obigen $ua->register; Endstelle, während Net::SIP::Registrar einen einfachen Re- Registrar/Proxy als ‘sip:[email protected]‘. Dann wartet es auf my ($done,$call _ created); $ua->listen( gistrar und Net::SIP::StatelessProxy einen Proxy konfiguriert. einen Anruf, spielt diesem die Message aus welcome.raw cb _ create => \$call _ created, Mittels Net::SIP::ReceiveChain können Programme konstru- vor und speichert gleichzeitig die Sprachdaten vom Anrufer filter => sub { $call _ created && return; # habe schon einen Anruf laufen iert werden, die sich je nach SIP Request als Endstelle, Regis- in data.raw. Außerdem läßt es nur bestimmte Anrufer zu return shift =~m/31\@/; # check gegen Absender trar oder Proxy verhalten, bei Bedarf auch mit Authorisierung (z.B. ‘sip:[email protected]‘). Nachdem eine Nachricht empfangen }, init _ media => $ua->rtp( ‘send _ recv‘, ‘welcome.raw‘,’data.raw’ ), durch Net::SIP::Authorize. wurde beendet es sich. recv _ bye => \$done, ); Listing 3 $ua->loop(\$done); Der Empfang und das Verschicken von Daten sowie evtl. nöti- Anrufen ge Wiederholungen beim Verschicken sind in Net::SIP::Dispat- Das Programm in Listing 4 benutzt als Proxy den obigen Re- use strict; cher und Net::SIP::Leg implementiert. gistrar/Proxy und ruft ‘[email protected]‘, also den simplen An- use Net::SIP; rufbeantworter aus dem letzten Beispiel, an. Dort hinterläßt my $ua = Net::SIP::Simple->new( from => ‘sip:[email protected]‘, Bis zu dieser Stelle ist der Code so aufgebaut, das er voll asyn- es die Message aus message.raw und beendet dann die Ver- outgoing _ proxy => ‘192.168.178.2‘, chron ausgeführt werden kann, was u.a. für den SIP-Firewall bindung. ); my $done; bei GeNUA nötig war, da dieser aus Performancegründen in my $call = $ua->invite( ‘sip:[email protected]‘, einem Eventloop (d.h. keine Threads und kein Forking) imple- init _ media => $ua->rtp( ‘send _ recv‘,‘message.raw’ ), cb _ rtp _ done => \$done, ); sox input.ogg -t raw -b -U -c 1 -r 8000 output.raw Listing 1 $call->loop( \$done ); Listing 4 sox -t raw -b -U -c 1 -r 8000 input.raw output.ogg $call->bye;

30 31 Perl

Runde und geschweifte Klammern kolon zu stehen hat und wann nicht (diese Regeln wurden weitestgehend aus C übernommen), hat Larry beschloßen, Der nächste Schritt ist in Tutorials oftmals die Einführung dass jedes Semikolon nach geschweiften Klammern ab jetzt von Variablen, denen ein Wert zugewiesen wird, der gleich freiwillig (optional) ist. Bei ‘if‘-Blöcken gilt das auch in Perl 5, Perl 6 Tutorial – wieder ausgegeben wird. aber nicht z.B. bei ‘eval‘-Blöcken. Teil 1 – Allgemeine Grundlagen Perl 6: Perl 5: my $a = 3; eval { say “Ich jongliere mit $a Bällen.“; Listing 3 print “Finden sie alle 3 Unterschiede !\n“ }; Listing 6 Da Skalare immer noch Variablen sind, die einen einzelnen Motive für ein neues Tutorial Hallo Perl 6 Wert speichern (egal welchen Datentyps) und immer noch Perl 6: mit der Sigil ‘$‘ anfangen, gibt es hier nichts weiter zu erklä- try { Perl 6 materialisiert sich langsam vor unseren staunenden Fast jede Einführung in eine Programmiersprache beginnt ren. Die Variable ist natürlich mit ‘my‘ als lexikalisch lokal say “Finden sie alle 3 Unterschiede !“ Augen und Neugierige, die bereits heute mit Hilfe des - mit einem „Hello World“. Auch wenn ich mir eigentlich was deklariert, da ‘use strict‘ gilt. Vielleicht könnte ich ein ‘if‘ } Listing 7 Interpreters und der Dokumentation (Synopsen) ihre ersten originelleres ausdenken wollte, bleibt es doch das kleinste einfügen, da ich Artistik mit ein oder zwei Bällen nicht jong- Programme darin schreiben, stehen vor echten Hürden. Die Programm, dass etwas erfreulich sichtbares tut, also starten lieren nennen würde. Der dritte Unterschied ergab sich, weil ‘eval‘ jetzt nur noch Sprache verändert sich in Nuancen fast jede Woche, Pugs wir auf ausgetretenen?, nein bewährten Pfaden: Strings auswertet und für das Ausführen von Blöcken probe- kennt noch nicht alle Befehle, und die Synopsen sind wahrlich Perl 6: halber, nun ‘try‘ statt ‘eval‘ zu verwenden ist. keine leichte Bettlektüre. Sie sind umfangreich, mit Fachs- Perl 6: my $a = 3; if $a > 2 { lang angereichert und eher darauf ausgerichtet komplizierte say “Seid gegrüßt, ihr Perl 6 Programmierer.“; say “Ich jongliere mit $a Bällen.“ Sonderfälle auszuleuchten, als Anfängern die ersten Schritte Listing 1 } Listing 4 zu erleichtern. Dafür bräuchte es eher ein Tutorial, dass sei- Ein nicht mehr ganz so freies Format ne Leser behutsam in die neue Sprache einführt und nur so Dieses erste Programm gibt doch tatsächlich den genannten Und hier sehen wir schon einen Unterschied zu Perl 5, der wenig Wissen wie sinnvoll voraussetzt, damit so viele Inter- Text aus. Der Befehl ‘say‘ entspricht dem bekannten ‘print‘, angenehm auffällt. Der dem ‘if‘ folgende Term kann, muss In Sachen Formatierung ist Perl allerdings etwas strenger essierte wie möglich, sich die begeisternden Verbesserungen fügt aber noch ans Ende der Ausgabe einen Zeilenumbruch aber nicht mehr, in runde Klammern gesetzt werden. Runde geworden. Leerzeichen können nicht mehr überall nach und Erweiterungen gegenüber Perl 5 aneignen können. an, der dem Standard des aktuellen Betriebssystems ent- Klammern dienen in Perl 6 nur noch dem Gruppieren. Hat belieben eingefügt werden. Natürlich ist die Breite der Ein- spricht. Klar gibt es ‘print‘ weiterhin, aber zur Gewöhnung man jedoch keine verschachtelte Struktur, sondern nur eine rückungen, sowie generell die Anzahl der Leerzeichen und Dieser Artikel soll ein solches Tutorial sein und er wird mit je- wird ab jetzt ‘say‘ verwendet. Ich kann aber bereits die Ein- einzelne Anweisung oder eine einfache Folge davon, werden Zeilenumbrüche zwischen 2 Bestandteilen eines Ausdrucks der Folge ein kleines Teilgebiet mit Beispielen und in Einzel- wände der erfahreneren Perlschreiber hören: Ein gutes Skript sie nicht benötigt. Dies gilt überall. Auch ein Array, eine Va- unerheblich. heiten dem geneigten Perl 6-Anfänger näher bringen. Denn beginnt mit strict und warnings. Und recht haben sie. In Perl riable die mehrere Werte speichert, kann nun ohne runde Perl war immer darauf aus, dem erfahrenen Codepoeten die 5 müsste das kleine Programm lauten: Klammern gefüttert werden. Perl 6: Arbeit zu leichtern und ist deswegen nicht an einem Tag voll- # Zuweisung eines Wertes ständig erlernbar. Auch darin ist Perl 6 eine Steigerung von Perl 5: Perl 6: $b = $a ; Perl 5. Um diesem Kurs einen größeren Nutzen zu entneh- # jetzt ich hab noch eine Kopie des Wertes use strict; my @primzahlen = 2,3,5,7; $C = $a; men, empfehle ich es, beim Lesen die Beispiele, oder eigene use warnings; Listing 5 $d Abwandlungen davon, mit Pugs auszuprobieren. Pugs findet = print $a ihr auf pugscode.org oder über perl.org. Hilfreich ist es auch, “Seid gegrüßt, ihr Perl 6 Programmierer.\n“; Dies ist auch möglich, weil das Komma jetzt ein listenerzeu- ; # und noch eine Listing 8 vorher den zweiteiligen Perl 6-Artikel gelesen zu haben, der Listing 2 gender Operator ist. Die zweite, nicht ganz so offensichtliche in den vorigen beiden Ausgaben abgedruckt war. Dort wurde Neuheit in Perl 6, die das Listing 4 zeigt, ist das Fehlen eines Aber Leerzeichen und Zeilenumbrüche haben schon eine von der Entwicklung des Projektes und den linguistischen Aber in Perl 6 entfällt das, weil beide Pragmas jetzt stan- abschließenden Semikolons. Seit Perl 1.0 trennt das Semi- trennende Wirkung. Gerade bei Operatoren sollte man jetzt Konzepten der Sprache berichtet. dardmäßig aktiviert sind. Das spart nicht nur die 2 Zeilen kolon einzelne Befehle. Lediglich der letzte Befehl innerhalb stärker darauf achten. Besonders der neue Präfix- Operator Code, die in fast allen meiner Programme sind, sondern es geschweifter Klammern (in einem Block), muss nicht mit (‘=‘), der teilweise die beliebte Funktion des Diamantopera- hilft jenen, die nichts darüber Wissen, potenzielle Probleme einem Semikolon abgeschlossen werden. Auch das sieht man tors (‘<>‘) übernimmt, kann leicht für eine Zuweisung ge- eher zu sehen. Bei Bedarf kann ja beides, wie bekannt, mit in Listing 4. Um sich nicht mehr merken zu müssen, wann halten werden. Oder auch folgende 2 Anweisungen laden zu ‘no strict;‘ und ‘no warnings;‘ abschaltet werden. nach einer schließenden geschweiften Klammer ein Semi- unterhaltsamen Verwechslungen ein:

32 33 Perl 6: Noch Kommentare? ist zeigt, welche hinterhältigen Fehler die alte Lesart bisher # Zuweisung einer Zeile aus einem Datenstrom Blitzmerker haben aus diesem Code bereits geschlossen, erlaubte: $b = =$a; dass Arrays nun immer mit ‘@‘ anfangen, Hashes nun immer In allen bisherigen Beispielen war es zu sehen: Wie aus Perl $b == $a; # numerischer Vergleich Listing 9 mit ‘%‘ und das der Punkt das Objekt und den Namen der 5, anderen Sprachen und Unix-Shells bekannt, leitet auch in Perl 5: Methode trennt, wozu früher ein Pfeil (‘->‘) diente (z.B.:‘$obj. Perl 6 die Raute (‘#‘) einen Kommentar ein, der mit der selben / ( # begin der capture Das gleiche Zeichen kann jetzt mehrere Operatoren darstel- methode()‘). Dass der Backslash (‘\‘) die nachfolgenden Leer- Zeile endet. Neu in Perl sind jedoch Kommentare, deren \w+ # alphanumerische Zeichen len, je nachdem, wie es von Leerzeichen umgeben ist: zeichen und Zeilenumbrüche „quotet“, also ihrer normalen Ende sich bestimmen läßt. Diese können mitten in eine Zeile | # nächste Alternative ... Bedeutung enthebt, ist auch nichts wirklich Ungewöhn- eingefügt werden oder sich über mehrere Zeilen erstrecken. ) /x; Perl 6 (siehe Listing 10) liches. Solche Kommentare beginnen auch mit einer Raute, der je- Listing 14 doch unmittelbar eine Klammer folgt. Als Klammern gelten Diese Unterscheidungen sind nicht gänzlich neu, da beide Das Stirnrunzeln beim Betrachter dieser Zeilen erwarte ich die Zeichen ‘()‘, ‘[]‘,‘{}‘ und ‘<>‘, wobei natürlich die zugehö- Der Slash (‘/‘) im Kommentar läßt perl vermuten, hier sei die Arten des Autoinkrementes schon in C bekannt sind. Un- erst, sobald sein Hirn diese beiden Gedanken verbindet und rige schließende Klammer den Kommentar beendet. Dabei Regex zu Ende und wird vom Nachfolgendem sehr sehr ver- erwartete Probleme kann es für Umsteiger aber auch beim die Frage auftaucht: Der Sliceoperator (die Klammern hinter kann man stets die Klammern wählen, die sich optisch vom wirrt. In Perl 6 haben Kommentare keinen Einfluß mehr auf Schreiben von Arrays, Hashes und von Objekten geben. Fol- einer Variable, mit deren Hilfe wir einzelne Werte, also Teile Quellcode abheben. Dies kennt man in Perl 5 schon von den Anweisungen und auch Dokumentation (POD) kann überall gende Schreibweisen werden nicht mehr erkannt: (slices), eines Arrays oder Hashes geliefert bekommen) ist Regulären Ausdrücken und vom Quoting, aber zur Verdeut- eingefügt werden, ohne das es mißverstanden wird. Auch doch nicht ernsthaft eine Methode des Objektes vom Typ Ar- lichung einige Beispiele (Perl 6 siehe Listing 13) öffnende Klammern denen ihr Gegenstück fehlt, werden Perl 5: ray oder Hash? in Perl nun wohlwollend übergangen. Allerdings ist im täg- Die letzten beiden Beispiele zeigen, dass mehrere Klammern lichen Gebrauch vor allem folgende Konsequenz dieser Tech- $array [$i]; $hash {$k}; Doch, ist es. Perl 6 ist so objektorientiert wie Ruby, auch wenn benutzt werden dürfen. Dabei hat man nur darauf zu achten, nik wirklich praktisch: $obj -> methode (); Listing 11 es sein möglichstes tut, dass vor dem Benutzer zu verbergen. beim Abschließen des Kommentars genau die passende Art, Zum Beispiel dadurch, in dem es oftmals den Punkt optional Anzahl und Reihenfolge der Klammern zu verwenden. Man- Perl 6: Wer seinen Quellcode so formatieren möchte, dass bestimmte läßt. Statt dem auch möglichen ‘@array.[3]‘ reicht wie ge- che mögen darin wieder neue Wege sehen, unleserlichen Teilausdrücke oder die Zeilenenden genau untereinander ste- wohnt ein ‘@array[3]‘. Nur in diesem Sonderfall, wenn man Quelltext zu schreiben, aber hinter dem Vorgestelltem steht say “Und der Gewinner ist %gewinner{“name“}.“; hen, braucht in Perl 6 die „long dot“ genannte Schreibweise: zwischen Objekt und Methode Leerzeichen einfügen will, vor allem eine neue Arbeitslogik des Perlinterpreters, die Listing 15 muss der Punkt verwendet werden, um Doppeldeutigkeiten einige aufdringliche und einige leicht zu übersehende Pro- Perl 6: zu vermeiden. Der Backslash darf auch nicht fehlen, denn ein blemfälle bereinigt. ‘.say‘ ist in Perl 6 eine andere Schreibweise für ‘$_.say‘ oder Mit Perl 5 ginge das nicht ansatzweise, weil perl die zweiten # ein Wert aus einem Array @array\ .[$i]; auch ‘say $_‘. Steht also ein Punkt vor einem Befehl, sucht Anführungsstriche als Textende ansieht, als Ende des Zu- # ein Wert aus einem Hash Perl kein vorher erwähntes Objekt, dessen Methode hier auf- standes: „Ich lese gerade einen Text von links nach rechts.“. In %hash\ .{ $k }; $obj\ # hier kann ich Kommentare einfügen gerufen werden soll, sondern interpretiert diesen Befehl als Setz es in „Anführungszeichen“ Perl 6 werden jedoch zuerst die äußeren Anführungsstriche .methode ( ) ; # Methodenaufruf Methode der aktuellen Kontextvariable, die immernoch, wie als Begrenzung des auszugebenden Textes erkannt und da- Listing 12 in Perl 5, ‘$_‘ heißt. Mit der Arbeitslogik meine ich das „one-pass parsing“, zu nach die darin zu interpolierende Hashvariable %gewinner, deutsch: ein Interpreter kann in einem Durchgang den Code von der nur der Wert mit dem Schlüssel „name“ gebraucht vollständig erfassen. Mit Perl 5 ist das leider anders. Hier wird. ++$b # Präfix-Operator, Autoinkrement vor Evaluierung schaut der aufgebohrte Bison-Parser öfters vor und zurück, $b++ # Postfix-Operator, Autoinkrement nach Evaluierung +$a # Präfix-Operator, das selbe wie num $a, ähnlich int $a um zu erkennen, was der Programmierer grad von ihm Dies soll für einen ersten Rundgang genügen, durch die allge- $a + $b; # Infix-Operator, Addition möchte und wechselt dabei zwischen verschiedenen Zustän- meinen Grundlagen von Perl 6. In der nächsten Folge werden =$b # Präfix-Operator, Zeile aus einem Datenstrom $a = $b; # Infix-Operator, Zuweisung den, wie etwa: „Dies ist Kommentar“, oder „Dies ist gerade Opertoren zur Veränderung und dem Vergleich von Skalar- [$a] # Circumfix-Opertor, Teilarray oder Reduktionsoperator eine Anweisung“. Perl 6 kennt nicht die Sonderregeln und werten das Hauptthema sein. < $a> # Circumfix-Opertor, qw() << $a >> # Circumfix-Opertor, interpolierendes qw() Listing 10 Doppeldeutigkeiten, welche dies notwendig machten. Das macht die Interpreter nicht nur schlanker und schneller, sondern auch narrensicherer. Beim Einlesen kann ein Perl # Herbert Breunung my $a #( = 6; ) = 5; # es 5 wird zugewiesen say “$a #(????) $a“; #( Ausgabe von ‘5 #(????) 5‘ 6-Interpreter die Quellen in immer kleinere Bedeutungsein- keine Kommentare innerhalb von Strings ) heiten aufspalten. Selbst wenn eine dieser Bedeutungsein-

$affe#{{.schreit()}}.guckt() # der schreit nicht, der guckt nur heiten keinen Sinn ergibt (eine Katze über die Tastatur lief), @zahlen#({ ?? ).reverse; reingefallen alles noch Kommentar Listing 13 beeinträchtigt dies nicht den Rest des Programmes. Ein Perl }).sort; # gibt sortierte Version des Arrays zurück 5-Beispiel mit einer Regex, die mit Kommentaren versehen

34 35 Perl

Ein Rechtsanwalt kommt in das Gerichtsarchiv und möchte Jetzt wird für jeden Schlüssel ein Eintrag im Hash erstellt. die Unterlagen zu mehreren Fällen einsehen. Dazu hat er sich Jeder Schlüssel soll den Wert „1“ erhalten. Deswegen muss in seiner Kanzlei schon eine Liste mit Aktenzeichen angefer- eine Liste mit „1“en zugewiesen werden. tigt. Auch hier hat der Anwalt wieder die zwei Möglichkeiten, Daten Scheibchenweise ... den Archivar einzeln losschicken oder dem Archivar einfach Ein häufiger Fehler, der gemacht wird, ist folgender: die Liste geben und der Archivar kommt mit einer ganzen La- (Slices) dung an Aktenordnern zurück. Die erste Möglichkeit würden @hash{ @keys } = 1; Listing 4 den Archivar wahrscheinlich ärgern, die zweite Möglichkeit ist aber optimal. Hier wird aber nicht für jeden Schlüssel ein „1“ gespeichert, Das ganze in Perl: sondern nur für den ersten Schlüssel. Die restlichen Schlüs- Ein nützliches Feature von Perl ist es, sogenannte „Slices“ Slices in Perl sel erhalten den Wert „undef“. Mit dem „(1) x scalar @keys“ my %archiv = ( verwenden zu können. Wörtlich übersetzt heißt es „Schei- az0815 => ‘Akte zum Aktenzeichen 0815‘, wird eine Liste erzeugt, die genauso lang ist wie die Liste der ben“. Diese „Scheiben“ sind bei Listen/Arrays häufig ge- So etwas kann ganz einfach in Perl nachgebildet werden, wie az2373 => ‘Akte zum Aktenzeichen 2373‘, Schlüssel. az2371 => ‘Akte zum Aktenzeichen 2371‘, wünscht. die Listings 1 bis 5 zeigen. ); Analog funktioniert es für Arrayslices. my @liste = qw(az0815 az2371); Beim Heraussuchen der Slices ( @apotheke[ @rezept ]: ) muss das „@“ vor apotheke stehen, weil diese Operation eine Liste my @akten = @archive{ @liste } Listing 2 my @array = (1..10); @array[2,4,6] = (99,98,97); Slices im Alltag zurückliefert (im Gegensatz zu dem Zugriff auf einzelne Ele- Listing 5 mente – $apotheke[$index]). Folgende Situation: Eine Person A war beim Arzt und benöti- Slices als lvalue gt Medikamente. A geht zur Apotheke X, um diese Sachen zu Wichtig ist auch, dass die Elemente in der gleichen Reihen- Hier werden in dem Array die Elemente mit den Indizes 2,4,6 besorgen. X ist wie ein großes Array (1. Element: Nasenspray, folge zurückgeliefert werden, wie die Indexliste ist, in die- Die Slices kann man nicht nur für das Auslesen von Daten durch die Zahlen in der zugewiesenen Liste ersetzt. $array[2] 2. Element: Aspirin,...). A möchte natürlich nicht die ganze sem Fall also „Nasenspray“ und dann „Hustensaft“. Wäre verwenden, sondern auch für Zuweisungen. Soll zum Bei- ist dann 99, $array[4] ist dann 98 und so weiter. Apotheke (nicht das ganze Array) haben, sondern nur einzel- das Rezept anders herum ( my @rezept = (2,0) ), wäre zuerst spiel ein Hash verwendet werden, der später für eine reine ne Sachen daraus. A hat jetzt zwei Möglichkeiten: der Hustensaft im Korb und dann das Nasenspray. Existenzüberprüfung dient, kann man das so machen: # Renée Bäcker

my @keys = qw(key1 key2 key3); 1. A sagt dem Apotheker ein Medikament, lässt den Apothe- my %hash; ker das Medikament holen, nennt danach das nächste Ele- @hash{ @keys } = (1) x scalar @keys; ment und so weiter bis A alle Sachen bekommen hat. Hashslices Listing 3 2. A gibt dem Apotheker eine Liste mit den Arzneinamen und Analog zu den Arrayslices oben gibt es in Perl auch noch die lässt den Apotheker alle Medikamente holen. Der Apotheker Hashslices, die aber im Prinzip genauso funktionieren. Hier kommt mit einem ganzen Korb voll mit den Arzneipäck- eine etwas andere Situation: chen. TPF: Vorstand wurde neu gewählt

Im Vorstand der Perl-Foundation gab es einige Änderungen. Bei den Wahlen im August 2007 gab es ein paar Verän- derungen: Richard Dice übernahm das Amt des Präsidenten von Bill Odom, der zum neuen Vorsitzenden gewählt # die Apotheke wurde. Jim Brandt wird neuer Vize-Präsident. Im Amt bestätigt wurden Kurt DeMaagd als Schatzmeister und Allison my @apotheke = (‘Nasenspray‘, ‘Aspirin‘, ‘Hustensaft‘, ‘Allergietabletten‘); ker c i Randal sowie Nat Torkington als weitere Vorstandsmitglieder. # A benötigt folgende Medikamente # hier sind aber die Arzneinamen schon # durch den Index in der Apotheke ersetzt TPF-T Richard Dice bleibt weiterhin Vorsitzender des „Steering Committees“ und Jim Brandt im „Conference Committee“ my @rezept = (0,2); - bis zu den nächsten Wahlen in den Kommitees. # A gibt dem Apotheker und bekommt den Korb voll mit Medikamenten my @korb = @apotheke[ @rezept ]; Kevin Lenzo, der bisher der Vorsitzende war, bleibt als Nicht-Stimmberechtigtes Mitglied dem Vorstand erhalten und print $ _ ,“\n“ for @korb; Listing 1 trägt jetzt den Titel „Director Eremitus“.

36 37 WEB Tags im Template $obj->param(TESTLOOP => [ {VALUE => ‘Wert1‘, Jetzt kommt der wichtigste Teil: Wie markiert man im Temp- {VALUE => ‘Wert2‘, ]); ode trennen – late, was wohin soll? Und wie kennzeichne ich, dass hier Design von C Mehrfach das „gleiche“ stehen soll? Für diese verschiedenen Compiled Sachen gibt es verschiedene Tags. While HTML::Template:: Die while-Schleife eignet sich ganz gut dazu, Ergebnisse aus Da nicht jeder den gleichen Geschmack beim Aussehen der Datenbank-Abfragen darzustellen. Tags hat, können die Tagstyles gewählt werden. In diesem Ar- tikel verwende ich das Aussehen von HTML-Kommentaren. Bedingungen Die Bedingungen sind sehr nützlich, wenn je nachdem was Zu den guten Sitten bei der Entwicklung von Webapplika- Was steckt hinter HTC? Variable passiert eine andere Information auftauchen soll. Allerdings tionen gehört es, HTML-Code von Applikations-Code zu Das einfachste sind Variablen. Hier wird einfach der Wert er- sollte man aufpassen, dass man nicht wieder zu sehr Darstel- trennen. Neben „übermächtigen“ Templating-Systemen wie Das Modul wurde von Tina Müller entwickelt und beinhaltet setzt. Ein ganz einfaches Template wäre lung und Logik miteinander vermischt. [1] oder Template-Toolkit [2] gibt es auch „leicht- einige Ideen von HTML::Template, das von Sam Tregar ge- gewichtige“ Systeme wie HTML::Template::Compiled [3]. schrieben wurde. Allerdings wurden einige Features wegge- Man sollte also immer abwägen, ob man eine Bedingung ins Hier wird gezeigt, wie man das Modul verwendet. lassen, dafür sind viele wichtige Features dazugekommen. Template schreibt oder doch lieber im Perl-Code integriert.

Sehr einfacher HTML-Text wird häufig mit dem Modul CGI. HTC compiliert das Template in Perl-Code. Dadurch wird das Und um hier einen Wert einzufügen, reicht ein If pm erzeugt, aber sobald das komplexer wird, hat man viele ganze System flexibler. In HTC ist auch ein Plugin-Mechanis- Das if-Tag setze ich sehr häufig ein. So kann ich zum Beispiel verschachtelte Funktionsaufrufe. Übersichtlicher wird das mus eingebaut, so dass es möglich ist, Plugins wie zum Bei- $obj->param(PLATZHALTER => ‘wert‘); bestimmte Bereich nur einblenden, wenn eine bestimmte durch „Here-Dokumente“ - aber auch das ist keine richtige spiel für Inline-Images zu verwenden. Bedingung erfüllt ist. So zum Beispiel, wenn auf einer Login- Lösung, wenn es um komplexeren HTML-Code geht. Schleifen Seite eine Fehlermeldung und ein Link kommen soll - aber Die Parameter werden erst beim Aufruf von output ersetzt. Natürlich gibt es auch bei HTML::Template::Compiled nur wenn es eine Fehlermeldung gibt. Das sieht dann so aus: Wenn Applikations-Code mit HTML-Code vermischt wird, Schleifen. Man kann ja nicht immer wissen, wie viele Wer- geht die Übersichtlichkeit schnell verloren. Es gibt einen te angezeigt werden. Zum Beispiel wenn Daten eines Gäste- richtigen Bruch im Quelltext. Da macht das Warten der An- buchs angezeigt werden sollen. Da sich die Zahl der Einträge Es ist ein Fehler aufgetreten. Wenn Sie Ihr Passwort vergessen haben, klicken Sie bitte wendung keinen Spaß. Wie wird das Modul verwendet? ständig ändert, kann man ja nicht jedesmal das Template hier anpassen. Und soll jede Seite anders aussehen, passiert es schonmal, Das Modul ist objektorientiert und wird auch so verwendet. dass für zwei sehr ähnliche Sachen der gleiche Code geschrie- Als erstes wird ein Objekt der Klasse HTML::Template:: Um mit Schleifen arbeiten zu können, sollte man sich etwas So kann ich die Anzeige „ausschalten“, indem ich für ERROR ben wird - bis auf den HTML-Teil. So etwas kann leicht durch Compiled erzeugt, dem der Pfad zum Template übergeben mit Referenzen auskennen. HTC benötigt für die Schleifen einfach keinen Parameter übergebe und wenn irgendwo ein das Verwenden eines Templating-Systems vermieden wer- wird. nämlich eine Arrayreferenz, in der für jeden Eintrag eine Fehler aufgetreten ist, mache ich einfach den. Hashreferenz vorhanden ist. use HTML::Template::Compiled; my $obj = HTML::Template::Compiled->new( $obj->param(ERROR => 1); Ich persönlich habe mich für HTML::Template::Compi- filename => ‘/path/to/template.tmpl‘ Loop ); led (HTC) entschieden, weil es ziemlich schnell ist, nicht Die einfachste Form der Schleife ist die LOOP. Das entspricht Wie sollte es auch anders sein - es gibt natürlich auch einen zu mächtig und für meine Bedürfnisse genau richtig ist. Es Die Methode, mit der am meisten gearbeitet wird, ist param. einer for-Schleife in Perl. else-Tag, damit Alternativen gezeigt werden können. Dabei gibt aber nicht das Template-System. Es muss jeder für sich Damit übergibt man dem Objekt die Werte für die Platzhal- ist zu beachten, dass der else-Tag zwischen den if-Tag und entscheiden, mit welchem System er/sie zurecht kommt. ter. em schließenden if-Tag kommt, also Bei Apache findet man einen kleinen Vergleich mit verschie- Wert: denen Systemen [4]. $obj->param(PLATZHALTER => ‘wert‘); zeig was Die Trennung von HTML und Applikations-Code hat auch Für die Ausgabe wird dann nur noch $obj->output() auf- Wie man sieht gibt es für diesen Tag – ähnlich wie bei HTML zeig was anderes den Vorteil, dass ein Designer sich um das Aussehen küm- gerufen, das die Ausgabe als String zurückliefert. Erst bei – ein schließendes Tag. mern kann und der Programmierer davon nicht betroffen ist. diesem Aufruf werden die Platzhalter tatsächlich ersetzt. Es muss also nicht befürchtet werden, dass nach einer De- Im Skript sieht die Ersetzung dann so aus: Ausserdem gibt es einen unless- und einen elsif-Tag. sign-Veränderung das Programm nicht mehr funktioniert. 38 39 Switch-Case Aber da es viele Entwickler gibt, die solche Features gerne HTML::Template::Compiled ist kein Perl-Parser. Das be- Ein weiterer Vorteil von HTC gegenüber HTML::Template nutzen - und dafür auch ihre guten Gründe haben - stelle ich deutet, dass man bei der Syntax selbst aufpassen muss. An- ist das Switch. Ich persönlich setze es nur bei kleinen Fallun- Menüpunkt1
dieses Feature hier vor. sonsten kommt eine Fehlermeldung, die aber nicht immer so Menüpunkt2
terscheidungen ein, ansonsten verlagere ich es in den Perl- eindeutig ist. Code. Standardmäßig kann man keinen Perl-Code im Template einbetten. Will man diese Eigenschaft nutzen, so muss das Caching Das folgende Beispiel soll zeigen, wie man sehr einfach einen bei der Objekterzeugung mitgeteilt werden: HTML::Template::Compiled ermöglicht das Caching. Mit Deutschen mit „Hallo“ und einen Italiener mit „Ciao“ begrü- Dynamische Includes precompile können Templates schon in Perl-Code übersetzt my $obj = HTML::Template::Compiled->new( ßen kann: Die dynamischen Includes gibt es nicht unter HTML::Temp- filename => $file, werden und in einem Verzeichnis abgelegt werden. Wenn late. Dies ist jedoch ein überaus nützliches Feature. So kann use _ perl => 1 bei der Objekterzeugung die cache _ dir-Angabe gesetzt ); Hallo man eine Webseite erstellen, die in mehrere Bereiche einge- ist, wird das Template nicht geparst, sondern es wird der ge- Ciao teilt wird, für jeden Bereich ein eigenes Menü hat, aber über- nerierte Perl-Code geladen. Das Template wird nur geparst, all ein gleiches Grundlayout. Jetzt kann im Template auch Perl verwendet werden, zum wenn es sich geändert hat. Und im Perl-Skript würde das folgendermaßen aussehen: Beispiel so: So etwas macht natürlich nur Sinn, wenn man sich Perl-Code Basis.tmpl: 4 ist größer als 3! $obj->param(WELCOME => ‘italiano‘); Referenzen sparen kann. Zum Beispiel wenn das „italiano“ von einer se- lect-Box kommt oder aus einer Datenbank. Wenn man sich [ 1 ] http://www.masonhq.com/ das „italiano“ selbst erst noch holen muss, dann könnte man Zum Testen habe ich ein kleines Skript dazu geschrieben [ 2 ] http://www.template-toolkit.org/ sich das Switch sparen, einen einfachen Platzhalter machen menue.tmpl: (siehe Listing 1). [ 3 ] http://search.cpan.org/dist/HTML-Template-Compiled/ und das „Hallo“ beziehungsweise „Ciao“ direkt einsetzen. [ 4 ] http://perl.apache.org/docs/tutorials/tmpl/ Menüpunkt1
Und man erhält folgende Ausgabe: comparison/comparison.html Menüpunkt2
Include ~/FooMagazin 17> perl htc _ test.pl Die Includes sind wichtig, wenn man zum Beispiel ein Basis- layout hat und das Menü in einer anderen Datei hat und in Wenn dieses Template in einem Skript verwendet wird, sieht 4 ist größer als 3! # Renée Bäcker das Basislayout einbinden will. Auch die eingebundene Datei die Ausgabe so aus: kann ein Template sein. Dann werden die Platzhalter „über- use HTML::Template::Compiled; nommen“. Das heißt, dass die Werte für die Platzhalter auch my $obj = HTML::Template::Compiled->new( Allerdings muss man mit dem Tagstyle etwas aufpassen. an das große Objekt übergeben werden müssen. filename => ‘/path/to/Basis.tmpl‘ Die klassische Darstellungsweise mit param(MYMENU => ‘menue.tmpl‘); > 0)> funktioniert nicht Hier muss ein anderer Tagstyle - Ein kleines Beispiel: wie zum Beispiel der ASP-Style - verwendet werden. bringt dann als Ausgabe: Basis.tmpl: Menüpunkt1
Menüpunkt2
1 #!/usr/bin/perl 2 3 use strict; 4 use warnings; menue.tmpl: 5 use HTML::Template::Compiled; Perl-Code 6 7 my $template = q~ Menüpunkt1
Bei HTML::Template::Compiled besteht auch die Möglich- Menüpunkt2
8 4 ist größer als 3! keit, Perl-Code in das Template einzubetten - allerdings erst 9 ~; 10 seit der Version 0.82. Ich persönlich nutze diesen Tag über- 11 my $obj = HTML::Template::Compiled->new(scalarref => \$template, Wenn dieses Template in einem Skript verwendet wird, sieht haupt nicht, da es für mich eine zu starke Vermischung von 12 use _ perl => 1,); 13 print $obj->output(); die Ausgabe so aus: HTML und Perl bedeutet. Listing 1

40 41 WEB

Die Stelle, an der die Rollen aus der Datenbank geholt wer- Damit hat man sich um alles nötige beim Auslesen geküm- den, ist in Listing 1 gezeigt. mert. Das Framework, hier in der Variable $f, wandelt den Hash mittels eines Serialisierungs-Moduls von Perl-Daten Listing 1 zeigt ungefähr, was alles aus der Datenbank ge- in einen String um und umgekehrt. Das Caching-Modul Das merk‘ ich mir – holt werden muss. Mit entsprechenden Optionen kann man verwaltet also einen einfachen String. Webapplikationen DBIx::Class auch dazu bringen, die Daten in weniger State- Caching in ments zu holen, es bleibt jedoch halbwegs aufwändig. Zusätzlich sollte man dafür sorgen, dass die Cache-Ein- träge auch irgendwann wieder verfallen; hier wurden 60 An diese Stelle kommt nun der Code, wie er in Listing 2 ge- Sekunden angegeben. Memcached oder Cache::FileCache zeigt ist. Man holt sich die Daten, die man braucht, aus dem (siehe unten) bieten entsprechende Optionen dafür. Cache, und falls dieser nichts zurückliefert, greift man auf Bei größeren Webapplikationen muss man sich verstärkt Beispiel 1: Rollen-System die bisherige Methode zurück. Wie der Cache intern arbeitet, Um explizit eine Änderung im Rollensystem sofort sichtbar darum kümmern, die Datenbank vor zu vielen Zugriffen wird später gezeigt. zu machen, muss man den Cache löschen. Also muss man zu schützen. Eine Methode ist Caching. Wenn man richtig Die Applikation hat ein Rollen-System, welches pro Benut- cacht, skaliert die Applikation besser. Denn während man zer mehrere Rollen hat, und jeder Rolle ist eine Liste von er- sub fetch _ roles _ and _ actions { durch Vervielfachung der Webserver zwar die Applikation laubten Aktionen zugeordnet. Nicht eingeloggte Benutzer my ($f) = @ _ ; selbst einfach loadbalancen kann, ist eine Vervielfachung bekommen z.B. die Rolle ‘gast‘, welche das Forum anzeigen # Datenbankabfrage, wie sie z.B. mit DBIx::Class aussehen würde # select role _ id from user _ role where user _ id = ? der Datenbanken nicht so leicht, da die Masterdatenbank kann, die Galerie und anonyme Artikel schreiben kann. # select * from role where role _ id in (...) auch dadurch belastet wird, dass sie die neuen Daten auch my @roles = $user->roles; # Weitere Datenbankabfragen an alle Replikanten verteilen muss. Mehrere Ebenen von Re- Anhand dieser Informationen werden Aktionen erlaubt/ver- # select * from role _ action where role _ id in (...) plikation führen dagegen dazu, dass die Daten langsamer bei boten und Buttons/Links im HTML dargestellt oder nicht. my @actions = map { $ _ ->actions } @roles; allen Replikanten ankommen. Schneller für das Auslesen aus der Datenbank wäre eine di- # In eine für die Benutzung/fürs Template rekte Zuordnung von Aktionen zum Benutzer, jedoch hätte # optimierte Form bringen. $roles _ and _ actions = { Dieser Artikel soll anhand zweier Beispiele zeigen, welche man damit eine nicht-normalisierte Datenbankstruktur, roles => [map { $ _ ->view } @roles], Daten man cachen kann. Damit soll verdeutlicht werden, mehr Daten und mehr Aufwand als Administrator beim Zu- actions => [map { $ _ ->view } @actions], }; wie man sich eine leicht anwendbare, generische API für das weisen der Aktionen. return $roles _ and _ actions; Caching erstellt. } Listing 1 Bei jedem Request wird nun aus der Datenbank gelesen, um Natürlich sollte man die Effizienz der Datenbankabfragen welchen Benutzer es sich handelt. Dann werden seine ihm nicht vernachlässigen. Gerade bei spezialisierten Anwen- zugeordneten Rollen geholt, und dazu wiederum die er- # alt dungen kann man, indem man die Anwendungsfälle analy- laubten Aktionen. Da es sich hier um zwei 1:n- Beziehungen my $roles _ and _ actions = $f->fetch _ roles _ and _ actions(); siert, sehr viel mehr optimieren. handelt, ist das ein nicht zu vernachlässigender Aufwand für # # neu die Datenbank. Im Einzelnen ist das nicht tragisch, aber es # als Cache-Key z.B. system/roles/123 gibt in einer Applikation mehrere solcher Stellen, die eine my $roles _ and _ actions = $f->from _ cache(‘system/roles/‘ . $user->id); unless ($roles _ and _ actions) { Seite zusammengenommen langsam machen und die Daten- # nichts im Cache oder veralteter Cache Community-Framework bank belasten können. # also doch Datenbank befragen $roles _ and _ actions = $f->fetch _ roles _ and _ actions();

Als Anwendungsfall stellen wir uns eine Art Framework vor, An dieser Stelle kann man aber die Applikation optimieren. $f->store _ cache( ‘system/roles/‘ . $user->id, # Key das mehrere „Module“ beinhaltet, wie ein Forum, eine Gale- Die zugeordneten Rollen ändern sich ja in der Regel sehr sel- $roles _ and _ actions, # Daten rie, ein Blog und ein integriertes User-Rollen-System. In all ten, besonders für die Rolle ‘gast‘. # Sekunden, bis der Eintrag automatisch verfällt 60, diesen Modulen werden bei jedem Request Daten benötigt, ); die sich aber häufig nicht ändern. Ein Cachen der gesamten Nun kann man für jeden Nutzer, sobald er sich einloggt, also } # noch etwas bequemer HTML-Ausgabe verbietet sich jedoch, da sowohl für jeden den ersten Request macht, seine ihm zugeordneten Rollen/ my $roles _ and _ actions = $f->cache( eingeloggten Benutzer als auch für Besucher Teile der Seite Aktionen in eine Perl-Datenstruktur speichern und cachen. ‘system/roles/‘ . $user->id, sub { $f->fetch _ roles _ and _ actions() }, dynamisch sind, beispielsweise die Anzeige der momentan Da in der Regel immer nur ein Bruchteil der gesamten Benut- 60, eingeloggten Benutzer. Wir müssen also Datenstrukturen zer gleichzeitig eingeloggt ist, sollte sich der Speicherplatz ); Listing 2 cachen, die dann dynamisch zum fertigen HTML zusam- hier in Grenzen halten. mengebaut werden. 42 43 in der Methode, die die Rollenänderung des Users durch- haltenen Links machen das ganze doch etwas umständlich. FastCGI noch mit mod_perl kann man Speicher einfach so Ist der Cache einmal voll, also hat der memcached-Server führt, folgenden Code hinzufügen: Man müsste alle Artikeltexte nach Tags durchsuchen, die untereinander teilen. seine Grenze erreicht und es befinden sich nur Einträge im verlinkten IDs gesammelt auslesen und wieder den Artikeln Cache, die noch nicht abgelaufen sind, muss trotzdem etwas $f->delete _ cache(‘system/roles/‘ . $user->id); zuordnen. Aus eigener Erfahrung kann ich empfehlen, in der Applikati- gelöscht werden. memcached wirft an dieser Stelle den Ein- Ändert man eine Rolle und löscht beispielsweise eine zuge- on einen Wrapper um das Caching-System zu basteln. Somit trag raus, der am längsten nicht abgerufen wurde („LRU“). ordnete Aktion, müsste man alle User mit dieser Rolle aus- Hier kann man es sich nun einfacher machen und einen Ca- ist man immer flexibel und kann bei Bedarf umschalten. findig machen und deren Rollen-Cache löschen; man kann che-Eintrag für den Thread machen, der alle Artikel-IDs Weitere ausführliche Infos findet man auf der Webseite von aber auch das automatische Verfallsdatum relativ niedrig enthält, und für jeden Artikel einen extra Cache-Eintrag. Die Caching-APIs an sich sind eigentlich recht einfach. Man memcached [1]. setzen. Das hat den Nachteil, dass sich Rollenänderungen Das resultiert dann in unserem Fall in 31 Datei- oder Cache- gibt beim Speichern einen eindeutigen Schlüssel an, die Da- erst nach maximal dieser Zeit auswirken. Das muss von Fall Zugriffen (bei Bedarf kann man auch immer 30 Artikel ein tenstruktur, und das Verfallsdatum bzw. -Zeit. Der schwie- zu Fall entschieden werden. einem Cache-Eintrag speichern). Die gecachten Datenstruk- rige Teil ist, sich zu überlegen, was man cacht, wie lange, und turen müssen nun lediglich an das Templating-System gelie- an welchen Stellen man bestimmte Cache-Einträge löschen Cache::FileCache Den Zeitraum, bis ein Cache-Eintrag verfällt, muss man fert werden. Im Idealfall hat man so z.B. bei einem Zugriff muss. generell nicht sehr hoch bemessen. Eine Minute ist ausrei- eines Gast-Benutzers keine einzige Datenbankabfrage. Cache::FileCache ist ein Modul aus dem Paket Cache::Cache chend. Es geht beim Caching um Skalierung. Es soll in erster [3]. Dieses Paket bietet mehrere Backends an, unter anderem Linie die Datenbank bei vielen Requests vor zu hoher Belas- Gegebenenfalls muss man aber auch die gecachte Daten- auch Cache::MemoryCache, welches anders als Cache::Mem- tung schützen. D.h. bei einem mäßig besuchten Forum wird struktur noch verändern und z.B. Teile herauslöschen. Dies memcached, Cache::Memcached cached die Daten direkt im Speicher des Prozesses hält. Das es öfter vorkommen, dass die Daten direkt aus der Datenbank sollte jedoch in der Regel kaum Zeit kosten. kommt für unsere Applikation nicht in Frage, da der Speicher gelesen werden. Die Datenbank sollte also durchaus so auf- memcached [1] ist ein in C geschriebener Caching-Server. Für dann viel zu groß werden würde. gebaut sein, dass der Benutzer nicht ewig warten muss. Das Beispiel: Die Übersichtsseite einer Forum-Webseite zeigt die meisten Linux-Distributionen sollte es fertige Pakete ge- Caching wird erst dann richtig nützlich, wenn viele gleich- die Liste der Foren und den letzten Artikeltitel des Forums. ben. memcached lässt sich sehr einfach starten. Zum ersten Ein Beispiel zur Benutzung von Cache::FileCache sieht man zeitige Requests abgesetzt werden. Manche Foren sind nur von Moderatoren lesbar. Cachen Testen reicht ein simples: in Listing 4. muss man alle, aber für normale Benutzer und Gäste muss $ memcached man dann die Moderatoren-Foren noch aussortieren. Standardmäßig wird der Cache im Verzeichnis /tmp/File- Der Default-Port ist 11211, man kann ihn mit -p verändern. Cache abgelegt, dieses Verzeichnis kann man jedoch mit der Beispiel 2: Thread-Darstellung Mit der Option -d schickt man den Prozess in den Hinter- Option cache _ root verändern. grund. Als weiteres Beispiel soll die Anzeige eines Threads im Fo- Welche Datenstrukturen werden Mit der Methode purge kann man verfallene Einträge lö- rum dienen. Jede Seite eines Threads zeigt 30 Artikel an. gecacht? Ein Beispiel für die Benutzung mit Cache::Memcached [2] ist schen lassen (bzw. Purge, um alle Namespaces zu reinigen). Im Rohtext können sich Tags befinden, z.B. Links auf ande- in Listing 3 beschrieben. Entweder man ruft diese Methode in einem Cronjob auf, oder re Threads, etwa [thread]1234[/thread], oder Links auf Es empfiehlt sich nicht, die Daten zu cachen, die z.B. direkt man setzt die Option auto _ purge _ interval auf den In- Benutzerprofile. In der gerenderten Form werden hier Links von DBIx::Class stammen. In jedem Objekt stehen nämlich Man sieht also, das Modul kümmert sich auch um die Seria- tervall (in Sekunden), in dem purge automatisch aufgerufen angezeigt der Form eine ganze Menge Meta-Informationen zur Datenbank, die lisierung von Datenstrukturen. Der Server kümmert sich um werden soll. Zu Details sollte man sich die Dokumentation man für die Anzeige gar nicht braucht. Deshalb empfiehlt es das Verfallsdatum. ansehen, zum ersten Testen reichen die in Listing 4 gezeigten sich, eine View-Klasse zu erstellen; das kann ein einfacher Optionen. Thread-Titel use Cache::Memcached; Hash sein oder aber ein simpel gehaltenes Objekt. use Cache::FileCache; my $memd = new Cache::Memcached { ‘servers‘ => [ “127.0.0.1:11211“ ], my $cache = new Cache::FileCache({ Somit müssen hier weitere Datenbankzugriffe erfolgen, um }; namespace => ‘system‘, den Thread-Titel oder den Benutzernamen auszulesen. Aus- default _ expires _ in => 60, $memd->set(‘foo‘ => “Some value“, 60); serdem erscheint neben jedem Artikel das Profil des Autors. Caching im Dateisystem, im Speicher }); $memd->set(“system/roles/$id“ => { oder zentral? my $roles = $cache->get( “roles/$id“ ); complex => [ “object“, 2, 4 ] Das heisst, es müssen 30 Thread-Artikel ausgelesen werden, }); unless ($roles) { die zugehörigen Profile der Autoren, und zu den Artikeltex- Bei einer kleinen Webseite kann man getrost im Dateisystem $roles = datenbank _ abfrage($id); my $val = $memd->get(“foo“); $cache->set( ten danach die verlinkten Thread-Titel und Benutzernamen. cachen. Sobald die Seite aber so häufig besucht wird, dass my $val = $memd->get(“system/roles/$id“); “roles/$id“, $roles, “60 seconds“ if ($val) { print $val->{complex}->[2]; } man Loadbalancer einsetzt, sollte man zentral cachen, und ); $memd->delete(“foo“); Man könnte mit entsprechend viel Aufwand optimierte Da- das geht mit einem Server wie memcached. Im Prozess selbst Listing 3 } Listing 4 tenbankabfragen machen, aber gerade die im Artikel ent- zu speichern macht den Prozess sehr gross, und weder mit

44 45 Im Gegensatz zu Cache::Memcached/memcached muss man Einsatz im Framework Darüber hinaus Bei den Cache-Lösungen muss man sich immer bewusst sich hier aber um die Größe des Caches kümmern, damit das sein, dass es „nur“ ein Cache ist, also redundante Daten Dateisystem nicht überläuft. Die Methode size (bzw. Size Listing 5 zeigt nun, wie die Framework-Funktion cache aus- Was kann man noch optimieren? gespeichert werden. Für Session-Daten ist es daher nicht für alle Namespaces) liefert die Größe des gesamten Caches. sehen könnte, die im Listing 2 benutzt wurde. Das Frame- geeignet. Da in der Dokumentation nichts weiter dazu zu finden ist, work (hier in $f) weiss, ob es Cache::FileCache oder Cache:: Unter bestimmten Umständen kann es sinnvoll sein, den muss man also selbst regelmäßig die Größe abfragen und Memcached verwenden soll und hat die entsprechenden Ob- Mysql-Querycache zu benutzen. Dafür sollte sich eine Ta- entsprechende Maßnahmen einleiten, wenn purge nicht jekte schon initialisiert. belle nicht allzu oft ändern, denn dann wird jedesmal der Referenzen ausreicht. Cache gelöscht. Wie man sieht, benutzen die beiden Caching-Module sogar Hat man Seiten, die keine dynamischen Teile beinhalten, [1] http://www.danga.com/memcached/ Im großen und ganzen ist Cache::FileCache auch ein Modul, dasselbe Interface, so dass die cache-Methode hier im Bei- kann man für diese Seiten einen Proxy wie squid [4] vor- [2] http://search.cpan.org/dist/Cache-Memcached welches man mit wenig Aufwand für eine erste lauffähige spiel sehr viel duplizierten Code enthält. Es sollte jedoch hier schalten. [3] http://search.cpan.org/dist/Cache-Cache Version eines Programms einsetzen kann. auch das Prinzip des Wrappers gezeigt werden. Auf diese Art [4] http://www.squid-cache.org/ kann man noch weitere Arten von Caching hinzufügen, die Manchmal ist es auch ratsam, direkt in der Datenbank be- vielleicht ein anderes Interface haben. rechnungsintensive Daten zu speichern. So könnte man # Tina Müller beim Beispiel der Thread-Darstellung den gerenderten Text eines Artikels beim Speichern generieren und neben dem Rohtext in die Datenbank schreiben.

sub cache { my ($f, $key, $expire, $sub) = @ _ ; if (my $c = $f->memcached) { Perl 6 Microgrant # konfiguriert mit Cache::Memcached # $c enthält also schon ein Objekt dieser Klasse my $data = $c->get($key); Die Perl Foundation hat einen neuen Perl 6 Microgrant bewilligt. Adriano Ferreira wird einen Artikel über die Opera- unless (defined $data) { # keine Daten im Cache, benutze die übergebene toren in Perl 6 schreiben und diesen dann auf ONLamp veröffentlichen. # subroutine, um die Daten aus der Datenbank zu holen $data = $sub->(); $c->set($key, $data, $expire); } return $data; } YAPC‘s 2008 elsif (my $c = $f->filecache) { # konfiguriert mit Cache::FileCache

# $c enthält also schon ein Objekt dieser Klasse ker Die Austragungsorte für die YAPC::NA und YAPC::Europe im Jahr 2008 wurden bekanntgegeben. Die YAPC::NA wird c # Der Einfachheit halber benutzen wir einen einzigen i wieder in Chicago ausgerichtet und die europäische Perl-Konferenz wird in Kopenhagen stattfinden. Genauere Infor- # Namespace, bei Bedarf kann man auch in Namespaces # nach Framework-Modulen unterteilen. mationen werden bald veröffentlicht. my $data = $c->get($key); unless (defined $data) { TPF-T $data = $sub->(); # hier bei Bedarf Cache-Größe abfragen, wenn # man viel cacht und das Dateisystem nicht # überlaufen soll CPAN-Testers Mailingliste $c->set($key, $data, “$expire seconds“); } return $data; Es gibt eine neue Mailingliste für die CPAN-Tester. Auf der alten werden weiterhin alle Testreports veröffentlicht, auf } der neuen werden die Diskussionen abgehalten. else { # die Applikation läuft ohne Caching # also einfach direkt aus der Datenbank holen Um sich dort einzutragen, reicht es, eine leere Mail an [email protected] zu schicken. my $data = $sub->(); return $data; } Listing 5 }

46 47 WEB

sub delete : Local { my ($self, $c, @name) = @ _ ;

foreach my $name (@name) { if (exists($c->session->{‘products‘}{$name})) { Catalyst delete($c->session->{‘products‘}{$name}); Sessions mit } }

$c->response->redirect($c->session ? $c->session->{‘lasturi‘} : $c->uri _ for(‘/‘)); } Listing 3

Die meisten Web-Anwendungen werden irgendwann zu len. In diesem Artikel werden zu diesem Zweck „Catalyst:: Wenn die Standardeinstellungen auf dem System nicht von Ein weiteres Beispiel dafür ist die Methode „delete“ im Mini- einem Punkt kommen, an dem es unerlässlich ist, Informa- Plugin::Session::State::Cookie“ und „Catalyst::Plugin::Ses- gängigen Umgebungen abweichen, braucht man nichts wei- Shop (siehe Listing 3). tionen über mehr als eine einzelne Anfrage zwischenzuspei- sion::Store::File“ eingesetzt. Die Namen der Module sind ter tun und kann direkt das eigentliche Programm angehen. chern, da HTTP von Haus aus ein zustandsloses Protokoll selbstredend - wir wollen client-seitig ein Cookie für die Ses- Hier wird mit der Funktion „delete“ der entsprechende Ein- ist. sion-ID setzen und server-seitig im Dateisystem speichern. In den meisten Fällen kommt man allein mit der zusätzlichen trag aus der Session gelöscht, wie man es gewohnt ist. Methode „session“ zurecht; Beispiel der Methode „add“ aus Vielen wird dieser Satz vertraut vorkommen, ist es schließ- Nennen wir die Beispielanwendung „My::MiniShop“, dann dem MiniShop (siehe Listing 2). Damit ist bisher nur die grundlegende Funktionsweise von lich ein wiederkehrendes Problem bei fast jedem neuen Web- muss „lib/My/MiniShop.pm“ um die Zeilen die mit „use Sessions in Catalyst beschrieben und es bleibt noch die Do- Projekt. Catalyst“ beginnen um „Session“, „Session::Store::File“ und Hier wird der Einfachheit halber der Name des Produktes zur kumentation zu erwähnen in der weitere Methoden zu fin- „Session::State::Cookie“ erweitert werden. In der lib/My/ Identifikation genutzt und in der Session um einen Zähler den sind, wie beispielsweise „session\_expires()“ mit der Lösungen dafür gibt es für alle bekannteren Web-Frame- MiniShop.pm sieht das dann zum Beispiel folgendermaßen erhöht. sich die Ablaufzeit einer Session prüfen, bzw. setzen lässt. works; hier wird die für Catalyst an einem Beispiel gezeigt. aus (siehe Listing 1). Im Großen und Ganzen ist die Session nichts anderes als eine Der für den Artikel geschriebene MiniShop ist zwar äußerst use Catalyst qw/ Ein grundlegendes Session-Framework erhält man mit der -Debug normale Hash-Referenz mit der man wie gewohnt Arbeiten simpel, demonstriert aber auf unkomplizierte Weise die Ver- Installation von Catalyst::Plugin::Session. Zusätzlich wird ConfigLoader kann. wendung des Session-plugins in Catalyst. Static::Simple noch jeweils ein Modul für die Zustände (State) und eins für Session die Speicherung (Store) benötigt. Hier findet man auf CPAN Session::State::Cookie # Simon Betrang Session::Store::File inzwischen mehrere Hände voll Module die unterschiedliche /; Listing 1 Schnittstellen für die Zustände und Speicherung bereitstel-

sub add : Local { my ($self, $c, @name) = @ _ ;

unless (@name) { unless (@name = $c->request->param(‘name‘)) { $c->response->redirect($c->uri _ for(‘/‘)); return; } PODCASTS – Teil 4 }

foreach my $name (@name) { Making your own CPAN Ross Turk von Sourceforge.net next unless (exists($product{$name})); Eine weitere Präsentation von brian d foy, die er bei einem Josh McAdams hat sich auf der OSCON 2007 mit Ross Turk $c->session->{‘products‘}{$name}++; Treffen der L.A. Perlmongers gehalten hat. Diesmal geht es - dem „Community Manager“ - über das System von Source- } darum, eigene kleine CPAN-„Mirrors“ aufzubauen. Es gibt forge.net unterhalten. Es geht darum, welche Infrastruktur

$c->response->redirect($c->session ? zwar schon Mini CPAN, aber selbst das ist häufig noch zu Sourceforge.net für Projekte zur Verfügung stellt und noch $c->session->{‘lasturi‘} : $c->uri _ for(‘/‘)); groß. brian d foy zeigt, wie man ein eigenes CPAN aufbaut viel mehr.. } Listing 2 nur mit den Distributionen, die für einen selbst interessant sind. # Renée Bäcker

48 49 Konferenz

dasteht. Es gibt dabei einige positive Signale, aber auch noch auch einfach etwas allgemeines, lustiges zu zeigen. Gera- viel Arbeit für alle Aktiven der Perl-Gemeinde. de für Konferenz-Neulinge ist es ein gutes Mittel, um ei- nen Einstieg in das „Halten von Vorträgen“ zu bekommen. Wien Diesmal gingen die Lightning Talks von (Unicode-)Bugs in YAPC::Europe 2007 in Perl, über GUI-Testing bis hin zu einem „Lessons learned“- Zweiter Tag (29.08.2007) Vortrag.

Der zweite Tag begann mit einer Keynote von Damian Con- Danach habe ich erstmal lange Pause gemacht, weil der way. Dabei durften die Teilnehmer der YAPC sehen, wie Con- Vortrag, den ich mir eigentlich anschauen wollte, ausgefal- way Variablen einführte, die wie Positronen auch zeitlich len ist. Vor der Mittagspause habe ich mir noch den MAD- rückwärts existieren können. Noch vor der Frühstückspause Vortrag von Gerard Goosens angehört. Dort wurde gezeigt, Der diesjährige europäische Perl-Workshop fand vom 28.-30. Beim Vortrag „Evolving architecture – make development wurde die „Jobmesse“ eröffnet. Zehn Unternehmen haben wie man einen Perl5-nach-Perl5-Übersetzer schreibt. Dabei August in der österreichischen Hauptstadt Wien statt. Für easy and your site faster“ zeigte Leo Lapworth, wie sich die hier ihre Stände aufgebaut, um sich potentiellen Bewerbern wird das Perl-Programm in eine XML-Struktur übersetzt, die drei Tage hatte sich große Prominenz angemeldet: Larry Umgebung von Webanwendungen im Lauf der Zeit verän- zu stellen. die nach Belieben verändert werden kann. Wall, Damian Conway und Mark Jason Dominus. Am Abend dert: von einem einzelnen Server, der alles alleine macht bis vor der Konferenz gab es ein großes Treffen in einem Wiener hin zu einem System mit mehreren Servern, die spezialisiert Nach der Frühstückspause zeigte Mark Jason Dominus am Zwischen Mittagspause und Kaffeepause fanden dann Restaurant. einzelne Aufgaben wahrnehmen. R. Geoffrey Avery zeigte Beispiel von Class::Observable, wie man „besseren“ Code die letzten Vorträge der diesjährigen YAPC::Europe statt. bei „Manage::Objects“ eine Möglichkeit, Objekte in einer Art schreibt und dabei die Fehleranfälligkeit minimiert. Es wa- Der erste Vortrag, den ich mir angehört habe, war von „Singleton“ „dauerhaft“ zur Verfügung stellen zu können. ren ein paar interessante Punkte dabei, die auf jeden Fall im Avar Arnfjörd Bjarmason über „5.10 regex pragmata“. Das Hinterkopf verbleiben sollten. „mock“ nutzte Google Code- Hauptthema dabei war die Implementierung des POSIX- Erster Tag (28.08.2007) Wie man in 28 Tagen etwas für das tägliche Geschäft lernen search um typische Schwachstellen in Perl-Modulen und -An- Plugins für die RegEx-Engine in Perl 5.10. Direkt im An- kann, zeigte Greg McCarroll in „28 days later“. wendungen zu finden. Zudem stellte er zwei Tools ganz kurz schluss hat „mock“ gezeigt, wie er riesige Datenmengen in Am 28.08. begann die Konferenz mit der offiziellen Eröffnung Der letzte Vortrag vor der Kaffeepause war „Catalyst – ref- vor, die beim Sicherheitstest von Webanwendungen nützlich eine Datenbank schreibt und dafür verschiedene Techniken durch Thomas Klausner. Bei der Eröffnung wurde auch der actor large apps with team and have fun!“. Dort wurde von sein können. Danach war die Mittagspause angesagt. wie , MogileFS und memcached verwendet. Ort der YAPC::Europe 2008 bekanntgegeben - Kopenhagen. Adam Bartosik gezeigt, wie er in einem Projekt von einfachen Der erste Vortrag wurde von José Castro gehalten. Dieser war CGI-Skripten auf die Verwendung von Catalyst kam und wel- Meine Mittagspause ging bis zur Kaffeepause, da mich die Ein paar „Nachteile“ von Perl – wie zum Beispiel fehlende hauptsächlich an die „Neulinge“ der Konferenz gerichtet. Es che Vorteile das gebracht hat – aber auch welche Nachteile Vorträge in der Zwischenzeit nicht so übermäßig interessiert Installationsroutinen von Perl-Anwendungen – zeigte Mark ging dabei darum, wie man für sich selbst möglichst viel aus damit verbunden waren. haben. Das lag aber nur daran, dass ich mich mit den The- Fowler. Dabei ging er zu jedem vermeintlichen Nachteil auf der Veranstaltung mitnehmen kann. Anschließend gab es men nicht beschäftige, und nicht an den Themen selbst. die Lösung ein. Der letzte Vortrag war eine Präsentation die erste Keynote – gehalten von . Der Erfinder von Eine sehr interessante Alternative zu HTML::Prototype und von „Perl Worst Practices“ von Marty Pauly. Neben „Vari- Perl ging dabei auf verschiedene Skriptsprachen und deren CGI::Ajax zeigte Jon Allen in „Lightweight Ajax with Open- Nach der Kaffeepause stand der zweite Conway-Vortrag auf ablen“ zeigte er auch, warum Reguläre Ausdrück zu „Bad Design ein. Thought“. OpenThought ist sehr leichtgewichtig und hat dem Programm. Zusammen mit Larry Wall gab es einen Code“ führen. viele Möglichkeiten, mit einfachen Mitteln Ajax-Funktionen Perl6-Update. Es gab viele kritische Fragen aus dem Audi- Nach der Frühstückspause ging es in fünf verschiedenen in Webseiten einzubauen. Ebenfalls um Webanwendungen torium, die Conway und Wall gut beantworteten. Direkt im Wie es Tradition ist, findet zum Abschluss noch eine Aukti- Räumen weiter, dieser Artikel berichtet aber nur kurz von je- ging es Leon Brocard „Scaling with memcached“. Gerade Anschluss wurde der Transport zum „Attendees Dinner“ on statt, mit deren Erlös die kommende YAPC unterstützt weils einem Vortrag. Der erste reguläre Vortrag, den ich mir stark frequentierte Webseiten wie Facebook haben das Pro- organisiert. Da der Veranstaltungsort nicht alle Teilnehmer werden soll. Dabei werden auch allerlei kuriose Dinge ver- angehört habe, wurde von Jan Henning Thorsen über Ope- blem, dass viele Datenbankabfragen gemacht werden müs- bedienen konnte, wurde ein „Alternativ Dinner“ organisiert. steigert. Diesmal wurde ein „Trainingslager mit Damian rator-Overloading gehalten. Hier wurde gezeigt, wie eigene sen und die Ergebnisse gecachet werden sollen. Dies wird Beim „Attendees Dinner“ gab es neben gutem Essen und Conway“ versteigert, das für 500 Euro (von mehreren Per- Subroutinen statt der Standardfunktionen bei bestimmten mit memcached und dem Perl-Modul Cache::Memcached Trinken vor allem die Möglichkeit, mit sehr vielen YAPC-Be- sonen bezahlt) an den Auktionator weitergereicht wurde. Operatoren ausführen kann. Dazu wird das Modul overload. erreicht. suchern zu sprechen. Die Organisatoren der kommenden YAPC::EU müssen bei pm verwendet. der nächsten Konferenz eine schwedische Flagge auf der Inhalte von Webseiten auslesen war das Thema von Tatsuhi- Stirn tragen – das wurde für 370 Euro versteigert. Damit Direkt im Anschluss zeigte Barbie von Birmingham.pm, wie ko Miyagawa in „Practical Web scraping with Web::Scraper“. war die YAPC::Europe 2007 in Wien vorbei! Webanwendungen mit Selenium getestet werden können. Dabei verzichtet er auf Reguläre Ausdrücke und verwendet Dritter Tag (30.08.2007) Dabei werden Beschränkungen von WWW::Mechanize (zum stattdessen XPath beziehungsweise CSS-Pfade. Der letzte # Renée Bäcker Beispiel, dass JavaScript nicht berücksichtigt werden kann) Vortrag am ersten Tag war „Finding Perl‘s place in the world“ 19 Talks in 90 Minuten – so fing der letzte Tag der YAPC:: aufgehoben. von Richard Dice. Er gab einen Einblick in seine Arbeit für Europe 2007 an. Die Lightning Talks sind ein gutes Mittel, die „Perl Foundation“ und wie Perl in der Außendarstellung ein Projekt oder ein Modul in kurzer Zeit vorzustellen. Oder 50 51 ALLGEMEINES iNTERVIE W

Rezension – André Mindermann Intermediate Perl über OTRS

Perl-Programmierer auf dem Weg vom Novizen zum Meister gezeigt, wie Vererbung und das Überschreiben von Funkti- FM: Hallo Herr Mindermann, vielen Dank, dass Sie sich die mehr erreichen. Und wer es bis heute noch nicht verinnerli- – das ist die Reihe „“, „Intermediate Perl“ und onen gemacht wird. Der Übergang zum „Module schreiben“ Zeit für dieses kleine Interview genommen haben. Bevor wir cht hat, Unit-Tests sind ein muss! „Mastering Perl“. Diese Rezension macht in der Mitte Halt ist dann fließend. Am Anfang wird der Aufbau der Dateien mit den Fragen beginnen, stellen Sie sich und Ihr Unterneh- und beleuchtet das Buch „Intermediate Perl“. Die drei Auto- einer typischen CPAN-Distribution erläutert. Nach der Ein- men doch bitte kurz vor. FM: Die Installation ist ja häufig ein großes „Manko“ bei ren sind Partner bei dem Schulungsunternehmen „Stonhen- führung in „Tests“ wird noch gezeigt, wie man seine Module Perl-Programmen. Im Gegensatz zu PHP-Skripten muss man ge Consulting“, und so verwundert es nicht, dass das Buch auf CPAN bekommt. AM: Mein Name ist André Mindermann. Ich bin 41 Jahre bei Perl-Programmen die Skripte mit den richtigen Rechten leicht verständlich geschrieben ist. alt und habe Betriebswirtschaft, Wirtschaftspädagogik und versehen und eventuell Module vom CPAN installieren. Ha- Dieses Buch ist auch für erfahrenere Perl-Programmierer Philosophie studiert. Ich lebe in Bad Homburg und bin seit ben Sie diese Probleme beim Deployment gelöst und wenn Die erste Auflage von „Intermediate Perl“ wurde im Jahr geeignet. Gerade wer seine eigenen CPAN-Module schreiben 1997 Unternehmer. Im Jahr 2003 habe ich zusammen mit ja, wie haben Sie das geschafft? 2003 von Randal L. Schwartz noch unter dem Namen „Lear- will und dieses CPAN-konform umsetzen will, sollte sich die Herrn Steinbild (Gründer der SUSE Linux AG) und Herrn ning Perl Objects, References & Modules“ veröffentlicht. Der letzten Kapitel genauer anschauen. Wer schon länger mit Perl Edenhofer (Erfinder der Software OTRS) die Firma OTRS AM: Das ist wahrlich nicht einfach. Wir haben für die Perl alte Titel beschreibt schon, was in dem Buch behandelt wird: zu tun hat, dem werden die ersten Kapitel über Referenzen GmbH gegründet. OTRS ist heute mit über 49.000 Instala- Pure CPAN Module (auch wenn diese etwas langsamer sind das Objektsystem in Perl, wie mit Referenzen umzugehen ist nicht weiter bringen. Dort wird Wissen vermittelt, das auto- tionen in 22 Sprachen das weltweit führende Helpdesk- als die in C geschriebenen Brüder) einen eigenen Ordner, und schließlich den Einsatz sowie das Entwickeln von Mo- matisch kommt, wenn man sich mit komplexen Datenstruk- und Ticketsystem. welchen wir mit OTRS ausliefern. So entfällt die Installation dulen. turen beschäftigt. einiger dieser CPAN Module und es müssen nur noch ein paar FM: Der Name “(())“ ist Programm. Sie haben viel mit von CPAN installiert werden (dies erleichtert die Installation Die 220 Seiten Inhalt sind in 19 Kapitel aufgeteilt, die jeweils Insgesamt ist es auf jedenfall ein Buch, das es sich zu lesen OTRS - einem Ticketsystem geschrieben in Perl - zu tun. Wie sehr stark). Will ein Anwender (der Profi) sein System tunen, so konzipiert sind, dass man ein Kapitel in rund einer Stun- lohnt. sind Ihre Erfahrungen mit Perl in einem größeren System dann entfernt er einfach den OTRS-CPAN-Ordner und kann de durcharbeiten kann. Am Schluss jedes Kapitels werden wie OTRS? über diesen Weg auch die schnelleren C Module benutzen. Aufgaben gestellt, die der Leser zur Übung machen kann. Die # Renée Bäcker Lösungen für die Aufgaben sind hinter den 220 Seiten Inhalt AM: Sehr gut. Man mag es kaum glauben, aber im Gegensatz FM: Perl bietet im Bereich Unit-Tests schon eine Vielzahl an angehängt. zu vielen anderen Programmiersprachen haben wir mit Perl Modulen, die für jedermann gedacht sind. Benutzen Sie die- bisher keine Probleme und wir setzen OTRS in vielen Firmen se Module oder verwenden Sie ein Framework? Das erste Kapitel fällt ein wenig aus dem Rahmen, da es ei- und Konzernen auch in heterogenen Umgebungen ein. Perl Wie stellen Sie sicher, dass jeder Use-Case in einem Test ab- nige Perl built-in Funktionen behandelt - map, grep und ist eine wichtige Schlüssel-Komponente in unserem Erfolgs- gebildet ist. Was können Sie unseren Lesern in Sachen „Test- eval. Danach geht es mit Modulen weiter. Am Anfang geht rezept. Strategien“ empfehlen? es um die Verwendung „fremder“ Module, die zum Beispiel von CPAN kommen. Im Anschluss werden Referenzen zum FM: OTRS zählt nicht zu den kleinsten Perl-Programmen. AM: Stimmt, es gibt einige Frameworks dafür. Wir hatten Thema von einfachen Themen wie „Wie erzeugt man Refe- Können Sie sagen, worauf Programmierer achten sollen, leider bestimmte Anforderungen, welche uns daran gehin- renzen“ über „Wie lang sind Referenzen gültig“ - hier spielt wenn es um Perl-Programme für die Business-Umgebung dert hatten diese zu nutzen. dann auch Garbage Collection eine kleine Rolle - bis hin zu geht? nützlichen Konstrukten wie die Schwartz‘sche Transforma- Wir haben eine sehr große und stark automatisierte Unit- tion (benannt nach Randal L. Schwartz). AM: KIS (keep it simple as possible). Das zählt nicht nur für Test-Umgebung. Wir haben die Anforderung, auch während Randal L. Schwartz, brian d foy & Tom Phoenix die Installation und Benutzung der Software sondern auch der Entwicklung ständig OTRS (den Framework) und die zu- Nach den „Referenzen“ sind „Objekte“ an der Reihe. Hier O‘Reilly Media, 2006 für die Architektur und den Quellcode. Je einfacher etwas sätzlichen Applikationen wie unter anderem OTRS::ITSM wird nach einer Einführung in das Objektsystem von Perl 0-596-10206-2 funktioniert, um so mehr können Sie es skalieren und damit testen zu lassen. Wir wollen sicherstellen, dass OTRS auf den

52 53 User-Gruppen

verschiedenen Plattformen (x586, X86-64, PPC, ...), Betriebs- FM: Sie suchen schon seit einiger Zeit nach Perl-Program- systemen (Windows, Unix, Linux, Mac, ...), Datenbanken mierern für Ihr Unternehmen. Woran liegt es, dass Sie an- (MySQL, Oracle, Postgres, ...) und Perl-Umgebungen (Perl- scheinend keinen geeigneten Bewerber finden? Ziehen Sie Versionen) ohne Fehler läuft. Die jenigen welche diese Kons- Konsequenzen aus der langen Suche? tellationen schon mal gehabt haben, können jetzt _fühlen_ Ruhr.pm – was ich meine. ,-) Somit haben wir eine Umgebung von ca. AM: Wir sind ein weltweit verteiltes Unternehmen und be- 50 Maschinen, welche ständig die verschiedensten Möglich- nötigen Mitarbeiter, die sich in einer dezentralen Unter- im Ruhrgebiet keiten testen und das Ergebnis in ein zentrales Unit-Test-Re- nehmensstruktur wohl fühlen. Zudem ist der Markt an gu- pository per SOAP übermitteln. Somit wissen wir tagesak- ten Perl-Programmierern leider wirklich dünn gesäht. tuell, ob es in irgendeiner Konstellation mit einer Änderung Probleme geben würde. FM: Wenn Sie einen Wunsch an die Perl Community in Deutschland frei hätten, was wäre dieser Wunsch? Das Ruhrgebiet ist mit fast 5,4 Millionen Einwohnern der undef Ich habe Ihnen zur Veranschaulichung ein kleines Test-Sys- größte Ballungsraum Deutschlands und nach Paris und tem unseres Unit-Test-Monitors bereitstellen lassen, um ein AM: Mut zur Lücke und auch als nicht perfekter Perl-Pro- London der drittgrößte in ganz Europa, doch zwischen Zu allen Zusammenkünf- wenig zu sehen was ich meine. Unsere Entwickler wissen grammierer bei uns bewerben (http://otrs.com/de/job/)! zahlreichen konkurrierenden LUGs, Computer- und Elek- ten begleitet uns undef, immer, wenn ein Unit-Test in einer bestimmten Umgebung ;) tronik-Treffs fand sich lange Zeit keine einzige Anlaufstelle unser Maskottchen. undef nicht mehr geht: für Perl-Interessierte und ihren Gedankenaustausch unter ist ein in China geborenes http://opms.otrs.com/otrs/public.pl?Action=PublicUnitTes Gleichgesinnten. Plüsch-Trampeltier mit t&Subaction=ProductView&Product=OTRS+2.2.x+CVS US-Amerikanischer Staats- So entstanden auch die Perl Mongers im Ruhrgebiet Ende bürgerschaft, das erst nach PS: Das wichtige bei der Sache ist natürlich auch noch, kein 2005 ursprünglich aus der Idee heraus, (noch) eine LUG zu Zahlung eines überhöhten Bugfix ohne neuen Unit-Test. Es soll ein Fehler ja nur ein- gründen, eine mit Schwerpunkten in der Softwareentwick- Lösegeldes aus einer Geisel- mal auftauchen! lung. Nach diversen kleinen Wettstreitigkeiten mit dem Ziel, haft im Amsterdamer Artis- komplexere Aufgaben mit möglichst wenig Quelltext mög- Zoo entlassen wurde. lichst schnell zu erledigen, fokussierte sich bald das Interes- se mit großem Abstand auf Perl. Teilnehmer

White Camel Awards Treffen Außer undef nehmen an unseren Treffen je nach Tagesform und Jahreszeit 10 bis 15 Personen verschiedenster Perl-Er- Die White Camel Awards 2007 gehen an: Seit dem ersten offiziellen Treffen derRuhr.pm [1] am 13. März fahrungsgrade teil. Unter den regulären Teilnehmern finden 2006 kommen wir in der Regel an jedem zweiten Montag des sich Schüler, Studenten und Angestellte genauso wie Hob- Monats um 19:00 Uhr im Café Maze [2] in der Essener Innen- by-Programmierer, Freelancer und Dozenten öffentlicher Allison hat schon sehr viel für die Perl-Gemeinde getan: Sie war Präsidentin der Perl-Foundation, war und ist sehr stadt zusammen, wo es sich in gemütlicher Atmosphäre ab- und privater Bildungseinrichtungen wie Universitäten, der aktiv bei der Entwicklung von Perl und Parrot und zuletzt hat sie die 2.0 entworfen, die in Zukunft wechslungsreich trinken und ausgezeichnet speisen lässt. AWO oder des Linuxhotels Villa Vogelsang. Auch Entwickler ker

c für den Perl-Code gilt. in großen OSS-Projekten wie OpenOffice.org und Organisa- i Ein typisches Treffen der Ruhr.pm besteht aus einem ausge- toren und Initiatoren lokaler OSS-Events (u.a. Essener Linux- Tim O‘Reilly dehnten sozialen und einem kürzeren technischen Teil, der tage, come2linux) sind stets anzutreffen. TPF-T Tim O‘Reilly ist nicht nur Gründer des O‘Reilly-Verlags, bei dem unter anderem das Kamel-Buch herausgekommen meist aus einem etwa 30-minütigen Kurz-Vortrag mit an- ist, Tim ist auch der „Gründer“ der Perl-Conference. schließender Diskussion besteht. Aufbauend auf diesen ein- fachen Kurz-Vorträgen werden bei Interesse oft eingehende Norbert Grüner Vorträge oder Workshops vorbereitet, die dann entweder Kommunikation Aus deutscher Sicht ist natürlich der dritte Preisträger sehr erfreulich. Norbert Grüner ist Mitbegründer des Deut- im Café Maze, im Konferenzraum der Keybits OHG [3] oder schen Perl-Workshops und sitzt mittlerweile im Vorstand der YAPC::Europe Foundation. in den Wohnungen und Gärten von Teilnehmern abgehalten Neben unseren Treffen sind der IRC [4] sowie die quasi obligato- werden. Diese Gärten sind auch Veranstaltungsort unserer rische Mailingliste [5] unsere zentralen Kommunikationsmit- jährlichen Juli-Grillabende. tel, deren Leserschaft neben vielen der regelmäßigen Teilneh-

54 55 News

mer auch eine ganze Reihe weiterer, uns teilweise nur virtuell ganze Reihe von Anti-Spam-Techniken implementiert. Wir bekannter Personen umfasst. Hier lassen sich dringende unterstützen das Projekt mit Audits und daraus hervorge- Fragen schnell klären und gemeinsame Projekte auch außer- henden Fehlerkorrekturen, Funktionserweiterungen sowie halb der monatlichen persönlichen Treffen organisieren. vor allem mit Vorträgen und Informationsständen auf loka- len Veranstaltungen rund um OpenSource. Termine

Projekte Vorbeikommen! Eines unserer aktuell in Entwicklung befindlichen Projekte ist eine nicht-kommerzielle Jobbörse [6] für Anstellungen so- Da Du diesen Text bis zum Ende durchgehalten hast und wir November 2007 Dezember 2007 wie Projekte, die direkt etwas mit Perl zu tun haben. Sie bie- Dich nicht verschrecken konnten, bist Du bei der Ruhr.pm 01. Treffen Dresden.pm 04. Treffen Frankfurt.pm tet Arbeitgebern und Vermittlern die Möglichkeit, auf ihren sicherlich genau richtig aufgehoben. Wir freuen uns immer Webservern Inserate in einem einfachen XML-Austauschfor- über Besuch! Egal ob es sich um einen einmaligen Abstecher 03. Linux-Info-Tag in Dresden Treffen Stuttgart.pm mat [7] anzubieten, die mehrmals täglich überprüft und in aus reinem Interesse handelt oder den Anfang einer regelmä- 06. Treffen Frankfurt.pm 06. Treffen Dresden.pm unsere Datenbank übernommen werden. Diese Datenbank ßigen Teilnahme. Und sollte die Ruhr.pm einfach zu weit ent- Treffen Stuttgart.pm 10. Treffen Ruhr.pm können Interessenten aus ganz Deutschland anhand der fernt sein, besuche uns doch einfach in unserem IRC-Chan- 12. Treffen Ruhr.pm 12. Treffen Hamburg.pm Postleitzahl ihres Wohnortes abfragen, eine Umkreissuche nel und auf unserer Mailingliste. Außerdem findet sich in 10./11. Linuxtage in Essen Treffen Cologne.pm informiert sie über Angebote in ihrer Nähe.Unterstützt wird diesem Fall mit Sicherheit eine andere PM-Gruppe in Deiner die Suche durch eine grafische Aufbereitung in verschie- Nähe. Eine vollständige Übersicht bietet hier das Verzeichnis 14. Treffen Hamburg.pm 20. Treffen Darmstadt.pm denen Karten, aktuell eine für das Ruhrgebiet sowie eine für der Perl Mongers [10]. Treffen Cologne.pm Treffen Erlangen.pm ganz Deutschland. # Veit Wahlich für Ruhr.pm 15. Treffen Darmstadt.pm 26. Treffen Berlin.pm Treffen Erlangen.pm Treffen Bielefeld.pm Ein anderes Projekt beschäftigt sich mit der Entwicklung 28. Treffen Berlin.pm des Spiels Virtual Hacking [8], das allgemeine Grundlagen der Systemsicherheit und Vernetzung vermitteln soll. Dabei Treffen Bielefeld.pm wird ein Netzwerk aus virtuellen Rechnern mit einem fikti- ven Betriebssystem abgebildet. Der Zugriff auf die Rechner erfolgt über eine per Telnet exportierte Konsole sowie über eine AJAX-gesteuerte grafische Oberfläche per Webbrowser. Hier finden Sie alle Termine rund um Perl. Januar 2008 Das Ziel des Spiels ist das erfolgreiche Absolvieren von Missi- 01. Treffen Stuttgart.pm onen, für die die Kontrolle über eine große Anzahl virtueller Natürlich kann sich der ein oder andere Termin noch än- Rechner Voraussetzung ist. Durch aktive Angriffe und Betrug dern. Darauf haben wir (die Redaktion) jedoch keinen 03. Treffen Dresden.pm verschafft sich der Spieler Zugang zu virtuellen Rechnern Links Einfluss. 08. Treffen Frankfurt.pm und muss diese gegen andere Spieler absichern und verteidi- 09. Treffen Hamburg.pm gen. Dabei muss er stets darauf achten, von den eigentlichen [ 1 ] Perl Mongers im Ruhrgebiet: http://ruhr.pm.org/ Uhrzeiten und weiterführende Links zu den einzelnen Treffen Cologne.pm Besitzern der virtuellen Rechner unentdeckt zu bleiben so- [ 2 ] Café Maze: http://www.maze-lounge.de/ Veranstaltungen finden Sie unter 14. Treffen Ruhr.pm wie durch geschicktes Verwischen von Spuren Verfolger wie [ 3 ] Keybits OHG: http://www.keybits.de/ Ermittlungsbehörden, Detekteien und Geheimdienste in die [ 4 ] IRC-Channel: http://ruhr.pm.org/chat/> http://www.perlmongers.de 17. Treffen Erlangen.pm Irre zu führen. [ 5 ] Mailingliste: http://ruhr.pm.org/mailingliste.psp Treffen Darmstadt.pm [ 6 ] Jobbörse: http://ruhr.pm.org/dev/jobboerse/ Kennen Sie weitere Termine, die in der nächsten Ausga- 30. Treffen Berlin.pm Bei unseren Aktivitäten versuchen wir jedoch, uns nicht stur [ 7 ] RJXML-Austauschformat: http://ruhr.pm.org/ be von $foo veröffentlicht werden sollen? Dann schicken Treffen Bielefeld.pm auf Perl zu beschränken. So bemühen wir uns auch um die specs/rjxml1/spezifikation.xml Sie bitte eine EMail an: Lösung der kleineren und größeren Probleme des Alltags, [ 8] Virtual Hacking: http://virtual-hacking.de/ wie z.B. mit unserem Engagement für das noch recht junge [ 9] Hermes Project: http://www.hermes-project.com/ [email protected] Hermes Project [9], einen einfach zu konfigurierenden SMTP- [ 10] Verzeichnis Europäischer Perl Mongers-Gruppen: Proxy, der transparent für den dahinter liegenden MTA eine http://www.pm.org/groups/europe.html

56 57 LINK s

„Statt mit blumigen Worten umschreiben unsere Programmierer den Job so: Apache, Catalyst, CGI, DBI, JSON, Log::Log4Perl, mod_perl, SOAP::Lite, XML::LibXML, YAML“

Perl-Community.de ist eine der größten deutschspra- chigen Perl-Foren. Hier ist aber nicht nur ein Forum zu finden, sondern auch ein Wiki mit vielen Tipps und Tricks. Einige Teile der Perl-Dokumentation wurden ins Deutsche übersetzt. Auf der Linkseite von Perl-Commu- http://www.Perl-community.de nity.de findet man viele Verweise auf nützliche Seiten.

Das Online-Zuhause der Perl-Mongers. Hier findet man eine Übersicht mit allen Perlmonger-Gruppen weltweit. Außerdem kann man auch neue Gruppen gründen und http://www.pm.org bekommt Hilfe...

Der Deutsche Perl-Workshop hat sich zum Ziel gesetzt, den Austausch zwischen Perl-Programmierern zu för- Professionell Perl dern. Der 10. Deutsche Perl-Workshop findet im Februar http://www.perl-workshop.de 2008 in Erlangen statt. programmieren lernen? Wir suchen Einsteiger als Die Perl-Foundation nimmt eine führende Funktion in der Perl-Programmierer/innen (Vollzeit/Praktikum) Perl-Gemeinde ein: Es werden Zuwendungen für Leistun- gen zugunsten von Perl gegeben. So wird z.B. die Bezah- lung der Perl6-Entwicklung über die Perl-Foundationen //SEIBERT/MEDIA besteht aus den drei Kompetenzfeldern Technologie, Consul- //SEIBERT/MEDIA GMBH ting und Design und gehört zu den erfahrenen und professionellen Internet- RhEIngAU PALAIS / SöhnLEInSTRASSE 8 geleistet. Jedes Jahr werden Studenten beim „Google Agenturen in Deutschland. Wir entwickeln seit 1996 mit heute knapp 50 http://www.perl-foundation.org 65201 WIESBADEn Summer of Code“ betreut. Mitarbeitern Intranets, Extranet-Systeme, Web-Portale aber auch klassische T. +49 611 20570-0 / F. +49 611 20570-70 Internet-Seiten. Seit 2005 konzipiert unsere Designabteilung hochwertige [email protected] Unternehmensauftritte und kommunikative Konzepte. Beratung im Bereich hTTP://WWW.SEIBERT-MEDIA.nET/jOBS/ Online-Marketing und Usability runden das Leistungsportfolio ab. Auf Perl.org kann man die aktuelle Perl-Version down- Ihre Aufgabe wird sein, in unserer Entwicklungsabteilung im Team komplexe loaden. Ein Verzeichnis mit allen möglichen Mailinglis- E-Business Applikationen zu entwickeln. Dabei ist objektorientiertes Denken ten, die mit Perl oder einem Modul zu tun haben, ist dort genauso wichtig, wie das Auffinden individueller und innovativer Lösungsan- zu finden. Auch Links zu anderen Perl-bezogenen Seiten sätze, die gemeinsam realisiert werden. http://www.Perl.org sind vorhanden. Wir freuen uns auf Ihre Bewerbung unter http://www.seibert-media.net/jobs/. 58 NEU! NEU! NEU!

FREAKZEIT im Linuxhotel! www.Linuxhotel.de

DAS Wochenend-Reiseziel für alle, die Spaß an Computern haben

Wo andere nach Hamburg ins Musical Die Freakzeit-Wochenenden sind ein Expe- oder in den Schwarzwald zur Wellness riment, denn eigentlich lebt das Linuxhotel fahren, treffen sich Computerfreaks nun von sehr zufriedenen Unternehmen und Or- jedes Wochenende im Linuxhotel, um ganisationen, die ihre Mitarbeiter bei uns zusammen mit Gleichgesinnten am PC schulen lassen (wir haben eines der brei- zu arbeiten. testen Kursprogramme in Deutschland, siehe www.Linuxhotel.de). Es erwartet Sie eine ruhige, konzentrierte Umgebung mit Leihnotebooks zum Testen Doch die IT-Branche ist etwas Besonderes! kritischer Installationen, Seminarraum, Tech- Viele Profis haben wirklich Spaß an ihrer nik, Bibliothek, Probeservern, WLAN, 230V- Arbeit, und es ist nicht einzusehen, warum Steckdosen selbst im 25.000qm großen Pri- z.B. Musical-Freunde oft mehrfach pro Jahr vatpark und vielem mehr. Auch Vollpension von weit her zu ihren Theatern fahren, doch und Getränke sind enthalten, bei schönem für Computerfreaks gibt es nichts Vergleich- Wetter wird gegrillt, wenn's kalt ist, geht es bares! in die Sauna. Fahrräder stehen bereit, kleine Modellflieger, Fitnessraum, eine Wii, und vor Das Linuxhotel soll der Ort werden, an dem allem all' der Kleinkram, den man für erfolg- man jedes Wochenende interessante Leute reiche Computerarbeiten braucht. aus unserer Branche zwanglos treffen kann. Machen Sie mit, schnappen Sie sich Ihr Warum nicht 'mal ein Wochenende unter Notebook, und melden sich für irgendeines Computerfreaks? Jeder arbeitet an seinem der kommenden Wochenenden an! Siehe Thema, aber man schaut sich zwanglos über www.Linuxhotel.de und auf „Freakzeit“ die Schultern und hilft sich gegenseitig! klicken.

Auch als Betriebsausflug geeignet! www.Linuxhotel.de Nicht grübeln, ausprobieren! 60