März 2009 Archive

Perl-Suchmaschine.de ist eine Spezialsuchmaschine rund um die Programmiersprache Perl, die nur ausgewählte Quellen berücksichtigt.

Dank der Vorauswahl werden die Suchergebnisse auf relevante Websites eingegrenzt. Das muss man einfach mal ausprobieren, dann werden die Vorteile deutlich.

Nachfolgend die Slides meines Lightning-Talks auf dem 11. Deutschen Perl Workshop.

Unterstützung willkommen

Mitstreiter sind ausdrücklich erwünscht. Entweder einfach interessante URLs über ein simples Formular hinzufügen/ausschließen oder einfach formlos bei mir melden.

Siehe auch

Auf dem 11. Deutschen Perl Workshop stellte Ulrich Habel in dem Vortrag Maintaining the be*st (fighting Perl and CPAN module authors for a better world) zunächst die NetBSD package collection (pkgsrc) vor.

NetBSD BSD-daemon

Im zweiten Teil geht Ulrich Habel detailliert auf die Verwendung von pkgsrc zur Verwaltung von CPAN-Modulen ein und weist auf typische Probleme im Alltag hin.

Neben den Slides (PDF) gibt es auch einen Audio-Mitschnitt des Vortrags .

 

Siehe auch

Die in Perl geschriebene Firmenwiki-Lösung Foswiki - The free and open source enterprise wiki stellte Martin Seibert in einem Kurzvortrag auf dem 11. Deutschen Perl Workshop vor.

Der Vortrag wendet sich an

  • alle, die sich für Wikis interessieren.
  • alle, die gerne mehr Beispiele für erfolgreiche Perl-Projekte vorzeigen möchten.
  • interessierte Perl-Entwickler, die gerne bei Foswiki mitarbeiten möchten.

 

 

Perl-Workshop Sponsoring

Martin Seibert ist Geschäftsführer der //SEIBERT/MEDIA GmbH, die u.a. Dienstleistungen rund um Foswiki anbietet, und Leiter der Marketing-Aktivitäten bei Foswiki und einer der Sponsoren des 11. Deutschen Perlworkshops.

Siehe auch

Renée Bäcker stellte in seinem Vortrag Module für nützliche Informationen (Slides) auf dem 11. Deutschem Perl Workshop einige nützliche Module für Kammerjäger vor:

  • PadWalker - play with other peoples' lexical variables
  • DBIx::Log4perl - Perl extension for DBI to selectively log SQL, parameters, result-sets, transactions etc to a Log::Log4perl handle.
  • DBIx::Class::Log4perl, leider noch nicht auf CPAN verfügbar
  • B::Concise - Walk Perl syntax tree, printing concise info about ops

Siehe auch

Enjoy!

Prof. Dr. -Ing. Fritz Mehner zeigte in seinem Talk "Der Editor Vim/gVim als Perl-IDE" auf dem 11. Deutschen Perl-Workshop in Frankfurt, wie man mit perl-support.vim und einigen CPAN-Modulen eine leistungsfähige Perl-IDE zaubert.

Die Slides sind bereits online.

perl-support.vim Features

  • Einfügen von Perl-Anweisungen und Idioms
  • Umfangreiche Kommentierungshilfen
  • Einfügen aller Dateitests und Spezialvariablen aus Menüs
  • Einfügen von POD-Anweisungen aus einem Menü, Erzeugung verschiedener Ausgabeformate
  • Einbindung von podchecker (Fehlerfenster, Fehlernavigation)
  • Zusammensetzung Regulärer Ausdrücke aus einem Menü
  • Code-Schnipsel-Verwaltung (Snippets)
  • Syntaxprüfung und Ausführung von Skripten, Kommandozeilenargumente
  • Hotkeys (besonders zur Verwendung im Konsolenmodus)
  • Einbindung der Perl-Dokumentation
  • Einbindung von Perl::Critic
  • Einbindung von Devel::SmallProf
  • Einbindung von Perl::Tidy

LInks zu wichtigen Erweiterungen für Vim/gVim

Siehe auch

make, ein Tool, das zum Zusammenbauen von Software aus verschiedenen Dateien genutzt wird, steht unter Windows standardmäßig nicht zur Verfügung. Stattdessen gibt es von Microsoft das kostenlose Tool nmake, das im Wesentlichen wie make funktioniert.

Achtung: nmake ist nur ein make-Programm für Windows und kein C-Compiler. Daher können mit nmake keine XS-Module übersetzt werden. Dazu benötigt man einen C-Compiler.

nmake installieren

Schritt 1: Download

ftp://ftp.microsoft.com/softlib/mslfiles/nmake15.exe

Schritt 2: nmake15.exe auspacken

nmake15.exe ist ein selbstextrahierendes Archiv, welches drei Dateien enthält:

  • nmake.exe
  • nmake.err
  • readme.txt

Schritt 3: nmake Dateien in ein geeignetes Verzeichnis verschieben

Die drei Dateien in das Perl-Bin Verzeichnis verschieben, meist C:\perl\bin\.

Fertig.

CPAN Module installieren

Die übliche Vier-Befehle-Sequenz

perl Makefile.PL
make
make test
make install

wird nun zu

perl Makefile.PL
nmake
nmake test
nmake install

Beispiel

Das gewünschte CPAN Modul downloaden, hier CGI.pm Version 3.42, und mit 7-Zip entpacken, dann in der Windows Eingabe-Aufforderung (cmd.exe) in das Verzeichnis wechseln, in welches das Modul ausgepackt wurde.

C:\Dokumente und Einstellungen\tf\Eigene Dateien\CGI.pm-3.42>perl Makefile.PL
Set up gcc environment - 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Checking if your kit is complete...
Looks good
Writing Makefile for CGI

C:\Dokumente und Einstellungen\tf\Eigene Dateien\CGI.pm-3.42>nmake

Microsoft (R) Program Maintenance Utility   Version 1.50
Copyright (c) Microsoft Corp 1988-94. All rights reserved.

cp CGI/Carp.pm blib\lib\CGI\Carp.pm
cp CGI/Push.pm blib\lib\CGI\Push.pm
cp CGI/Switch.pm blib\lib\CGI\Switch.pm
cp CGI/Fast.pm blib\lib\CGI\Fast.pm
cp CGI/Util.pm blib\lib\CGI\Util.pm
cp CGI/Apache.pm blib\lib\CGI\Apache.pm
cp CGI.pm blib\lib\CGI.pm
cp CGI/Pretty.pm blib\lib\CGI\Pretty.pm
cp CGI/Cookie.pm blib\lib\CGI\Cookie.pm

C:\Dokumente und Einstellungen\tf\Eigene Dateien\CGI.pm-3.42>nmake test

Microsoft (R) Program Maintenance Utility   Version 1.50
Copyright (c) Microsoft Corp 1988-94. All rights reserved.

C:\Perl\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib\lib', blib\arch')" t/*.t
t/apache................ok
t/can...................ok
t/carp..................ok
t/cookie................ok
t/fast..................ok
        7/7 skipped: various reasons
t/form..................ok
t/function..............ok
        2/32 skipped: various reasons
t/html..................ok
t/no_tabindex...........ok
t/pretty................ok
t/push..................ok
        1/12 skipped: various reasons
t/request...............ok
        3/34 skipped: various reasons
t/start_end_asterisk....ok
t/start_end_end.........ok
t/start_end_start.......ok
t/switch................ok
t/upload................ok
t/uploadInfo............ok
t/util-58...............ok
t/util..................ok
All tests successful, 13 subtests skipped.
Files=20, Tests=521,  5 wallclock secs ( 0.00 cusr +  0.00 csys =  0.00 CPU)

C:\Dokumente und Einstellungen\tf\Eigene Dateien\CGI.pm-3.42>nmake install

Microsoft (R) Program Maintenance Utility   Version 1.50
Copyright (c) Microsoft Corp 1988-94. All rights reserved.

Installing C:\Perl\html\lib\CGI.html
Installing C:\Perl\html\lib\CGI\Carp.html
Installing C:\Perl\html\lib\CGI\Cookie.html
Installing C:\Perl\html\lib\CGI\Fast.html
Installing C:\Perl\html\lib\CGI\Pretty.html
Installing C:\Perl\html\lib\CGI\Push.html
Installing C:\Perl\html\lib\CGI\Util.html
Installing C:\Perl\lib\CGI.pm
Installing C:\Perl\lib\CGI\Apache.pm
Installing C:\Perl\lib\CGI\Carp.pm
Installing C:\Perl\lib\CGI\Cookie.pm
Installing C:\Perl\lib\CGI\Fast.pm
Installing C:\Perl\lib\CGI\Pretty.pm
Installing C:\Perl\lib\CGI\Push.pm
Installing C:\Perl\lib\CGI\Switch.pm
Installing C:\Perl\lib\CGI\Util.pm
Appending installation info to C:\Perl\lib/perllocal.pod

C:\Dokumente und Einstellungen\tf\Eigene Dateien\CGI.pm-3.42>
perl -MCGI -e "print $CGI::VERSION"
3.42

That's it.

Siehe auch

Geo::IP von Boris Zentner ermöglicht die regionale Zuordnung von IP-Adressen oder Hostnamen.

Geo::IP bietet eine kleine, aber häufig ausreichende, Auswahl an Geoinformationen der Geolocation Datenbank vom MaxMind. Wer mehr möchte, muss auf die kommerzielle Version upgraden.

Nachfolgend ein Beispiel zur Ermittlung des Herkunftslandes und ein Beispiel zur Ermittlung detaillierter Ortsinformationen.

Beispiel Länderinfo (Herkunftsland)

Geo::IP liefert Länderinformationen gemäß ISO 3166 zurück. Für weitere Details verweise ich auf den Beitrag Locale::Country - ISO 3166 - Norm für Kodierung von geographischen Einheiten.

#!/usr/bin/perl 
use strict;
use warnings;

use Geo::IP;

my $ip = '81.169.145.71';
my $host = 'perl-howto.de';


	# Download: http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
	# Nutzt GeoIP.dat in /usr/local/share/GeoIP/
my $gi = Geo::IP->new(GEOIP_STANDARD) or die $!;

	# Datenbankinfos ausgeben
my $db_info = $gi->database_info() or die $!;
print "Datenbankinfo: $db_info\n";

    # Methoden bei bekannter IP

my $country     = $gi->country_code_by_addr( $ip ) or die $!;
my $country3    = $gi->country_code3_by_addr( $ip ) or die $!;
my $countryname = $gi->country_name_by_addr( $ip ) or die $!;

print "\n";
print "Info fuer $ip\n";
print "Country:      $country\n";
print "Country3:     $country3\n";
print "Country Name: $countryname\n";

    # Methoden bei bekanntem Host

$country     = $gi->country_code_by_name( $host ) or die $!;
$country3    = $gi->country_code3_by_name( $host ) or die $!;
$countryname = $gi->country_name_by_name( $host ) or die $!;

print "\n";
print "Info fuer $host\n";
print "Country:      $country\n";
print "Country3:     $country3\n";
print "Country Name: $countryname\n";

Das Programm erzeugt folgende Ausgabe

Datenbankinfo: GEO-106FREE 20090201 Build 1 Copyright (c) 2007 MaxMind LLC All Rights Reserved

Info fuer 81.169.145.71
Country:      DE
Country3:     DEU
Country Name: Germany

Info fuer perl-howto.de
Country:      DE
Country3:     DEU
Country Name: Germany

Beispiel Ortsinfo

Hierzu wird zusätzlich die Datenbank GeoLiteCity.dat benötigt (Download).

#!/usr/bin/perl 
use strict;
use warnings;

use Geo::IP;

my $ip   = '81.169.145.71';    # perl-howto.de
my $host = 'google.de';

# Download --> http://geolite.maxmind.com/download/geoip/database/
my $gi =
  Geo::IP->open( "/usr/local/share/GeoIP/GeoLiteCity.dat", GEOIP_STANDARD )
  or die $!;

my $db_info = $gi->database_info();
print "Datenbankinfo: $db_info\n";

my $record = $gi->record_by_addr($ip) or die $!;
display( $ip, $record );

$record = $gi->record_by_name($host) or die $!;
display( $host, $record );

###########################################################
sub display {
    my $info   = shift @_;
    my $record = shift @_;

    print "Info fuer $info\n";
    print "Country Code:   ", $record->country_code,   "\n";
    print "Country Code3:  ", $record->country_code3,  "\n";
    print "Country Name:   ", $record->country_name,   "\n";
    print "Region:         ", $record->region,         "\n";
    print "Region (Name):  ", $record->region_name,    "\n";
    print "City:           ", $record->city,           "\n";
    print "PLZ:            ", $record->postal_code,    "\n";
    print "Latitude:       ", $record->latitude,       "\n";
    print "Longitude:      ", $record->longitude,      "\n";
    print "TimeZone:       ", $record->time_zone,      "\n";
    print "Area Code:      ", $record->area_code,      "\n";
    print "Continent Code: ", $record->continent_code, "\n";
    print "Continent Name: ",
      continentcode2continent( $record->continent_code ), "\n";
    print "Metro Code:     ", $record->metro_code, "\n";
    print "\n";
}
###########################################################
sub continentcode2continent {
    my $code = shift @_;

    #Possible continent codes are AF, AS, EU, NA, OC, SA
    #for Africa, Asia, Europe, North America, Oceania  and South America.
    my %continent = (
        'AF' => 'Africa',
        'AS' => 'Asia',
        'EU' => 'Europe',
        'NA' => 'North America',
        'OC' => 'Oceania',
        'SA' => 'South America',
    );
    if ( exists $continent{$code} ) {
        return $continent{$code};
    }
    else {
        warn "Unknown Continent for <$code>\n";
        return;
    }
}
###########################################################

Das Programm erzeugt folgende Ausgabe

Datenbankinfo: GEO-533LITE 20090201 Build 1 Copyright (c) 2007 MaxMind LLC All Rights Reserved

Info fuer 81.169.145.71
Country Code:   DE
Country Code3:  DEU
Country Name:   Germany
Region:         16
Region (Name):  Berlin
City:           Berlin
PLZ:            
Latitude:       52.5167
Longitude:      13.4000
TimeZone:       Europe/Berlin
Area Code:      0
Continent Code: EU
Continent Name: Europe
Metro Code:     0

Info fuer google.de
Country Code:   US
Country Code3:  USA
Country Name:   United States
Region:         CA
Region (Name):  California
City:           Mountain View
PLZ:            94043
Latitude:       37.4192
Longitude:      -122.0574
TimeZone:       America/Chicago
Area Code:      650
Continent Code: NA
Continent Name: North America
Metro Code:     807

Hier lässt sich erkennen, das die Städte-Datenbank für Nordamerika besser gefüllt ist als für Europa.

Ubuntu Installationstipps

Zunächst sollten die Bibliotheken für Geo::IP installiert werden:

sudo apt-get install libgeoip1 libgeoip-dev

Die Datenbank GeoIP.dat befindet sich nun in /usr/share/GeoIP/.

Geo::IP erwartet die Datenbanken aber in /usr/local/share/GeoIP/.

Also installiere ich die Datenbank und die monatlich kostenlos zum Download zur Verfügung gestellten Updates nach /usr/local/share/GeoIP/, da Geo::IP die Datenbanken dort erwartet.

Siehe auch:

Andreas 'ads' Scherbaum stellt die Unterlagen seines Tutorials "PostgreSQL optimieren und mit Perl kombinieren" auf dem 11. Deutschen Perl-Workshop in Frankfurt/Main als PDF zur Verfügung.

Inhaltsverzeichnis

  • Performancesteigerung durch optimale Nutzung der Hardware
  • Konfiguration, Anpassen an die vorhandene Hardware
  • Einsatz serverseitiger Programme (PL/pgSQL und PL/Perl)
  • PostgreSQL in Perl Skripts nutzen
  • Analyse von Anfragen und Einsatz von Indizes
  • information_schema und pg_* sinnvoll nutzen
  • Volltextsuche installieren und nutzen
  • Partitionierung, Replikation, horizontales Skalieren

Enjoy

Siehe auch

Steffen Müller, hat die Slides von seinem Vortrag Application deployment and dependency management with PAR auf dem 11. Deutschen Perl-Workshop veröffentlicht.

PAR (Perl Archiving Toolkit) ist das Perl-Äquivalent zu Javas JAR und vereinfacht das Verteilen und Installieren von Perl-Anwendungen. Auf dem Zielrechner muss kein Perl installiert sein.

Steffen Müller geht in seinem Vortrag zunächst auf die Grundlagen von PAR ein und arbeitet sich sukzessive zu den weniger bekannten, aber nützlichen, Features wie PAR::WEBStart vor.

Enjoy!

Siehe auch:

Alvar Freude hat auf dem 11. Deutschen Perl-Workshop das sehr gute Tutorial Goldene Regeln für die Entwicklung von Perl-Applikationen (Slides) gehalten.

Der Vortrag hat mir sehr gut gefallen und ich unterstütze die von Alvar genannten Regeln. Alvars Verdienst ist daher auch die Veranschaulichung und Ordnung dieser Regeln.

Für alle, die nicht auf dem 11. Deutschen Perl-Workshop waren, eine Liste der insgesamt 42 Regeln (garniert von mir mit einigen Links zu den dort erwähnten Modulen und zu weiterführenden Artikeln).

Alavars 42 Goldene Regeln für Perl-Applikationen

Oder: Wie sichert sich ein Perl-Entwickler vor dem Psychopathen mit der Kettensäge

Vorbereitung

  • Regel 1: Aktuelles, eigenes Perl
  • Regel 2: Erdbeeren vor die Fenster
  • Regel 3: Entwicklungsumgebung
  • Regel 4: Versionskontrollsystem

Arbeitsweisen

  • Regel 5: Code Planen
  • Regel 6: Architektur überprüfen
  • Regel 7: Schreibe erst die Tests!
  • Regel 8: Objektorientierung nutzen
  • Regel 9: Code Review

CPAN-Tauglichkeit

Vorsicht vor dem Psychopathen

  • Regel 13: Schreibe einfachen Code
  • Regel 14: Keine globalen Variablen
  • Regel 15: Nutze Perl::Tidy
  • Regel 16: Kommentiere ausführlich
  • Regel 17: Namenskonventionen
  • Regel 18: Altlasten
  • Regel 19: Perl Best Practices
  • Regel 20: Test::Perl::Critic
  • Regel 21: Schreibe Tests!
  • Regel 22: Teste klein und groß
  • Regel 23: Kein printf-Debugging
  • Regel 24: Nutze Devel::Cover

CPAN

  • Regel 25: Nutze das CPAN
  • Regel 26: Sei aktuell
  • Regel 27: Lokaler CPAN-Mirror

Moderne Techniken

Web-Entwicklung

  • Regel 38: Schreibe keine CGIs!
  • Regel 39: FastCGI zur Beschleunigung
  • Regel 40: mod_perl
  • Regel 41: Kein HTML im Code
  • Regel 42: Nutze Web-Frameworks

Siehe auch

Häufig steht man vor der Frage, wo genau eine Variable (oder allgemein ein Perl-Wert) referenziert wird.

Devel::FindRef von Marc Lehmann ist ein kleines Modul, mit dem man exakt herausfinden kann, wo eine bestimmte Variable referenziert wird, ob es einen Referenz-Zyklus gibt, oder welche closure den Wert noch referenziert.

Marc Lehmann hat Devel::FindRef in einem Lightning Talk auf dem 11. Deutschen Perl-Workshop in Frankfurt/Main vorgestellt.

Einfaches Beispiel

#!/usr/bin/perl 
use strict;
use warnings;

use Devel::FindRef;
                         
    # Die Variable, die untersucht werden soll
our $var            = 'hi there';

    # Ein paar Referenzen auf diese Variable
my $global_my       = \$var;
our %global_hash    = ( key1 => \$var );
our $global_hashref = { key2 => \$var };


testsub();
                           
sub testsub {             
      my $testsub_local = $global_hashref;
	  print "Track für \$var '$var':\n";
      print Devel::FindRef::track \$var;
}                             

Das Programm erzeugt folgende Ausgabe:

Track für $var 'hi there':
SCALAR(0x8169fe8) [refcount 5] is
+- in the global $main::var.
+- referenced by REF(0x8169fa8) [refcount 1], which is
|  in the lexical '$global_my' in CODE(0x8155318) [refcount 2], which is
|     +- the containing scope for CODE(0x81a5468) [refcount 3], which is
|     |  in the global &main::testsub.
|     +- the main body of the program.
+- referenced by REF(0x8169f28) [refcount 1], which is
|  in the member 'key2' of HASH(0x81550b8) [refcount 2], which is
|     +- referenced by REF(0x81a54c8) [refcount 1], which is
|     |  in the lexical '$testsub_local' in CODE(0x81a5468) [refcount 3], which was seen before.
|     +- referenced by REF(0x81a5168) [refcount 1], which is
|        in the global $main::global_hashref.
+- referenced by REF(0x8155308) [refcount 1], which is
|  in the member 'key1' of HASH(0x816a368) [refcount 1], which is
|     in the global %main::global_hash.
+- referenced by REF(0x81551d8) [refcount 1], which is
   a temporary on the stack.

Die Ausgabe muss man sich anfangs wohl zwei- oder dreimal anschauen, danach wird es besser.

Beispiel: Verwendung von closures und weaken

#!/usr/bin/perl 
use strict;
use warnings;


use Devel::FindRef;
use Scalar::Util;
                         
our $var            = 'hi there';
my $global_my       = \$var;
our %global_hash    = ( key1 => \$var);
our $global_hashref = { key2 => \$var };
                           
sub testsub {             
      my $testsub_local = $global_hashref;
	  print "Track fuer \$var '$var':\n";
      print Devel::FindRef::track \$var;
}                             


my $closure = sub {
      my $closure_var = \$_[0];
      Scalar::Util::weaken (my $weak_ref = \$var);
      testsub();
   };

$closure->($var);

Das Programm erzeugt folgende Ausgabe:

Track fuer $var 'hi there':
SCALAR(0x8169f58) [refcount 6] is
+- referenced by REF(0x81a5640) [refcount 1], which is
|  in the lexical '$closure_var' in CODE(0x81a5600) [refcount 4], which is
|     +- the closure created at f2.pl:22.
|     +- referenced by REF(0x81a5440) [refcount 1], which is
|     |  in the lexical '$closure' in CODE(0x8155318) [refcount 2], which is
|     |     +- the containing scope for CODE(0x81a5460) [refcount 3], which is
|     |     |  in the global &main::testsub.
|     |     +- the main body of the program.
|     +- in the lexical '&' in CODE(0x8155318) [refcount 2], which was seen before.
+- referenced by REF(0x816a008) [refcount 1], which is
|  in the lexical '$global_my' in CODE(0x8155318) [refcount 2], which was seen before.
+- in the global $main::var.
+- referenced by REF(0x8169f28) [refcount 1], which is
|  in the member 'key2' of HASH(0x81550b8) [refcount 2], which is
|     +- referenced by REF(0x81a54d0) [refcount 1], which is
|     |  in the lexical '$testsub_local' in CODE(0x81a5460) [refcount 3], which was seen before.
|     +- referenced by REF(0x81a51a0) [refcount 1], which is
|        in the global $main::global_hashref.
+- referenced by REF(0x8155308) [refcount 1], which is
|  in the member 'key1' of HASH(0x816a368) [refcount 1], which is
|     in the global %main::global_hash.
+- referenced by REF(0x81551d8) [refcount 1], which is
   a temporary on the stack.

Cool!

Siehe auch:

ExelPerl von Martin Fabiani (strat) kann via Win32::OLE Excel-Dateien direkt editieren (lesen und schreiben).

Das Tool ist somit zwar auf Windows-Betriebssysteme mit installiertem Excel beschränkt, allerdings steht der volle Funktionsumfang von Excel zur Verfügung.

Beispiele

Wie bei perl -ane, wird eine while-Schleife um das Kommando gelegt. Das Kommando wird für jede Zeile ausgeführt, wobei die einzelnen Werte der Zeile im Array @F zur Verfügung gestellt werden. Da es sich dabei um ein tied Array handelt, werden Änderungen an einem Element von @F auch direkt in der Excel-Datei geändert, z.B. die Spalte A in Großbuchstaben ändern:

excelPerl -ane "$F[0] = uc $F[0]" -f datei.xls

Zusätzlich steht das Array @C zur Verfügung, das die Win32::OLE-Objekte der einzelnen Zellen enthält und worüber der Zugriff auf die gesamte Funktionalität von Excel möglich ist, z.B. die Spalte B auf die Schriftart "Courier New" setzen:

excelPerl -ane "$C[1]->{Font}->{Name} = 'Courier New'" -f datei.xls

Siehe auch

Dann handelt es sich wahrscheinlich um eine(n) Perl-Programmierer(in).

Good Fortune

Quelle: Good Fortune, schon etwas betagt, aber immer wieder schön.

Über dieses Archiv

Diese Seite enthält alle Einträge von Perl HowTo von neu nach alt.

Februar 2009 ist das vorherige Archiv.

April 2009 ist das nächste Archiv.

Aktuelle Einträge finden Sie auf der Startseite, alle Einträge in den Archiven.

Blog Roll

Powered by

Powered by Movable Type 5.2.10

Creative Commons-Lizenz

Creative Commons License
Dieses Weblog steht unter einer Creative Commons-Lizenz.