Monday, October 29, 2007

HP-Drucker-Anzeige verändern...

Eben bin ich auf einen tollen Blog-Eintrag gestoßen: Yaakov hat ein kleines Perl-Skript geschrieben, mit dem sich die Anzeige von HP-Druckern verändern lässt...

Vortragsfolien online

Die Folien von meinen Vorträgen vom 3. Frankfurter Perl-Community Workshop sind online...

Frankfurt Perl-Workshop Tag 3

Gestern war der letzte Tag des 3. Frankfurter Perl-Community Workshop. Um kurz vor 11 Uhr hat Martin mit seinem LDAP-Vortrag begonnen. Diesmal war auch der Beamer aus dem Club Voltaire vorhanden; dennoch haben wir auch mit VNC gearbeitet...

Danach habe ich einen Vortrag über DBIx::Class gehalten, bei dem ich in der Vorbereitung wieder ein paar Kleinigkeiten über das Modul gelernt habe - also quasi "Lernen durch Lehren"...

Nach mir war dann Max an der Reihe. Erst hat er über mögliche Probleme bei der Verwendung von base.pm berichtet und dass mit seinem Modul parent.pm nicht auftreten. Sein Modul bedeutet auch wieder Arbeit für mich, weil ich dadurch mein Modul Class::Superclasses anpassen muss *g* Auf solche Arbeit freut man sich aber ;-)

Als nächstes hat Max dann einen "Perl für Fortgeschrittene"-Vortrag gehalten, in dem er ein eigenes "ORM" gebaut hat. Max hat noch kurz vor dem Vortrag den Inhalt angepasst, nachdem ich in meinem DBIx::Class-Vortrag eine Aussage getroffen habe, dass eines der Features vermutlich nicht ganz so einfach nachzubauen wäre. Max hat dann gezeigt, dass es wohl doch recht einfach sein sollte, das Feature nachzubauen. Danke...

Im Anschluss an Max war ich wieder an der Reihe. Ich habe kurz gezeigt, wie man mit Selenium und seinen Komponenten sehr schnell und einfach Webanwendungen testen kann. Da wir kein Internet hatten und ich das mit getesteten Tests zeigen konnte, musste ich improvisieren und schnell was auf dem Laptop machen. Das hat natürlich nicht sofort geklappt, aber der Fehler war schnell behoben. Das zeigt nur wieder, dass man Live-Demos sehr gut vorbereiten sollte! In so einer Runde wie hier ist das nicht so wild wenn etwas nicht auf Anhieb 100%ig läuft, aber auf einer größeren Konferenz wäre das nicht so toll...

Als letzter Vortrag wurden die neuen Features von Perl 5.10 gezeigt. Dazu habe ich Paul Fenwicks Vortrag verwendet...

Danke an alle, die Vorträge vorbereitet haben und an Erkan, der die Räumlichkeiten organisiert hat!

Insgesamt war es ein echt tolles Wochenende mit vielen interessanten Themen...

CfP vom Dt. Perl-Workshop endet heute!

Heute endet die Frist zur Einreichung von Vortragsvorschlägen für den 10. Deutschen Perl-Workshop. Wer also noch einen Vorschlag hat, sollte ihn möglichst schnell über die Webseite des Workshops einreichen...

Sunday, October 28, 2007

Frankfurt Perl-Workshop Tag 2

Am gestrigen Samstag haben wir die ersten Vorträge gehört. Die Veranstaltung findet im Club Voltaire statt. Dort haben wir ziemlich günstig einen Raum bekommen, der für die Größe der Veranstaltung vollkommen ausreicht.

Eigentlich sollte ein Beamer für uns bereit stehen, aber als ich in den Raum kam, war natürlich keiner da. Ich habe dann Martin noch schnell angerufen, ob er nicht seinen 21-Zoll-TFT mitbringen könne. In der Zwischenzeit sind Thomas und Max aufgetaucht. Nachdem auch die beiden vergeblich nach einem Beamer gesucht hatten, kam Wieland rein. Max hatte die Idee mit VNC zu arbeiten. Wir hatten WLAN, so dass wir bei den Vortragenden den VNC-Server installierten und alle die Präsentation auf dem eigenen Laptop verfolgen konnten.

Martin hat von seinem Laptop aus noch den Monitor bedient, so dass wir genügend Möglichkeiten hatten, auch ohne Beamer den Vortrag zu verfolgen. Max hat (zumindest die ersten beiden Vorträge) aufgenommen. Mal schauen was dabei rausgekommen ist...

Den ersten Vortrag habe ich über CGI::Application gehalten. Die Folien und Beispielprogramme werde ich demnächst auf meiner Homepage veröffentlichen.

Nach mir war dann Martin an der Reihe. Er hat erst das Poard - die Software von Perl-Community.de - vorgestellt und dann sein ExcelPerl vorgestellt. Da ich abends etwas vorhatte, musste ich die Veranstaltung leider verlassen.

Was die weiteren Vorträge waren, hat Thomas aufgeschrieben...

Saturday, October 27, 2007

Frankfurter Perl-Community Workshop - Tag 1

Traditionell ist am 1. Tag des Frankfurter Perl-Community Workshops ein Kennenlernen. Gestern mussten wir auf die Schnelle improvisieren, weil unser Stammlokal - das Café Activ - zu hatte. Vorher hatte sich keiner darum gekümmert, nachzufragen ob sie überhaupt auf hätten. Aber alles kein Problem. Martin Fabiani und ich waren kurz vor sechs am Café Activ. Martin hatte mich angerufen, um mir mitzuteilen dass sie zu haben. Ich war allerdings keine 5 Meter von ihm entfernt ;-)

Wir haben dann einen Zettel geschrieben, dass das Treffen in einer Bar gegenüber stattfindet. Anscheinend hat es jeder gelesen, der kommen wollte... Kurz nachdem Martin und ich uns gesetzt hatten, kam Wieland rein. Wir waren dann eine ganze Zeitlang zu dritte, bis Thomas kam. So nach und nach kamen alle - bis wir zu neunt waren.

Wir haben über alle Mögliche geredet - von der Vortragseinteilung für den Workshop über Perl bis zu ganz allgemeinen Themen. Um kurz vor 23 Uhr hat sich unsere Runde aufgelöst. Wir wollen ja für die Vorträge ausgeschlafen sein...

Friday, October 26, 2007

Perl-Programmierer gesucht...

In meinem Postfach stapeln sich mittlerweile die ganzen Projektanfragen. Selbst wenn ich mich durch 5 teilen würde, wäre ich immer noch voll ausgelastet. Einerseits ist es schön zu wissen, dass man mit Perl immer noch sehr gut Geld verdienen kann, andererseits ist es nicht so toll, dass diese Stellen nicht besetzt werden können. Denn so besteht die Gefahr, dass die Unternehmen auf Perl verzichten und etwas Anderes einsetzen...

Wenn also jemand auf der Suche nach einem Perl-Projekt ist oder jemanden kennt, kann gerne an perlprojekte@renee-baecker.de schreiben (diese Mail-Adresse wird allerdings nur rund 4 Wochen bestehen). Vielleicht kann ich ja was "vermitteln"...

Thursday, October 25, 2007

Hiveminder richtig nutzen

Hiveminder ist eine ToDo-Anwendung, die in Perl geschrieben ist. Als Framework wird Jifty verwendet.

Paul Fenwick hat einen tollen Vortrag darüber gehalten, wie Hiveminder richtig genutzt wird. Ich nutze Hiveminder schon länger als ToDo-Liste, aber anscheinend habe ich noch lange nicht alles genutzt...

Wednesday, October 24, 2007

StrawberryPerl-Homepage

Perl und Windows - da gibt es nicht nur ActivePerl, sondern seit einiger Zeit auch ein paar andere Bundles. Eines davon ist StrawberryPerl.

Adam Kennedy hat jetzt eine eigene Webseite dafür eingerichtet...

Der Vorteil von StrawberryPerl gegenüber ActivePerl ist, dass ein passender C-Compiler gleich mitgeliefert wird und man nicht mehr auf die PPM-Versionen von Modulen warten muss.

Tuesday, October 23, 2007

Grants Commitee hat einen neuen "Chef"

Alberto Simões ist zum neuen Vorsitzenden des "Grants Commitee" der TPF gewählt worden. Ich denke, dass die Wahl den richtigen getroffen hat. Er hat einen guten Kontakt zur "Basis", da er Vorsitzender der "Portuguese Association for Perl Programmers" ist und die Perlmonger-Gruppe von Braga leitet.

Den Lesern von "The Perl-Review" wird er sicherlich auch bekannt sein, da er regelmäßig Artikel für die Zeitschrift schreibt.

Ich wünsche ihm viel Spaß und viel Erfolg!

Monday, October 22, 2007

Code-freeze für Perl 5.10.0

Soo, langsam aber sicher rückt die Version 5.10.0 näher. Rafael Garcia-Suarez hat vor wenigen Minuten den Code-freeze angekündigt. Er wartet nur noch auf zwei Updates...

Ich freue mich schon sehr auf die neue Version, da sie doch ziemlich viel Neues bringt.

Noch eine Woche CfP für Dt. Perl-Workshop

Heute in einer Woche (29. Oktober) endet die Frist, um Vortragsvorschläge für den 10. Deutschen Perl-Workshop einzureichen. Wer einen Vortrag halten möchte, sollte also möglichst bald den Vorschlag auf der Webseite einreichen!

siehe auch den "Call for Papers"

Thursday, October 18, 2007

MySQL Quickpoll

Auf der MySQL-Homepage kann man darüber abstimmen, mit welcher Programmiersprachen man MySQL-Anwendungen implementiert...

Wednesday, October 17, 2007

Tuesday, October 16, 2007

CPAN-Gesichter...

Ich habe ja schonmal davon berichtet, dass es für CPAN-Autoren die Möglichkeit gibt, sich selbst ein "Gesicht" zu geben - über Gravatare. Jetzt wurden alle Gravatare mal gesammelt und in einer kleinen Bildergalerie online gestellt. Wie hat Andy Armstrong so schön geschrieben:

"We're disappointingly white and male - but who knew how damn fine we'd look as a group? Somebody should organise a naked calendar photo shoot next. People would pay lots of money not to see that."

Friday, October 12, 2007

In 80 Tagen um die Welt - Zwischenbericht

Nach rund einem Zehntel der Reisezeit musste ich feststellen, dass es auf der Perl-Landkarte doch noch einige weiße Flecken gibt, so dass ich die Reise nicht kontinuierlich mit Modulen begleiten kann. Gerade im Arabischen Raum ist diese Landkarte noch quasi unerschlossen. Entweder gibt es dort keine Perl-Programmierer (in Dubai gibt es welche, ist aber trotzdem zu wenig) oder sie gründen keine PM-Gruppen und veröffentlichen keine Module auf CPAN...

Sobald ich wieder etwas habe, werde ich natürlich wieder Module vorstellen...

Perl-Neuigkeiten selbst einreichen...

Ich hatte der TPF mal vorgeschlagen, sogenannte "local representatives" einzuführen. Damit könnte man einen besseren Kontakt zur "Basis" bekommen und Neuigkeiten besser weiterverbreiten. Das würde der Wahrnehmung von Perl in der Öffentlichkeit ganz gut tun. Wir wissen, dass Perl noch lange nicht tot ist und eine tolle und mächtige Sprache ist. Leider ist das Bild von Perl in der Öffentlichkeit nicht ganz so gut.

TPF möchte meinen Vorschlag mal überdenken und auf die Frage, wie die "local representatives" an Neuigkeiten etc. kommen würde und wie es weiterverbreitet wird, habe ich gesagt, dass es man eine Plattform haben müsste, bei der jeder Neuigkeiten einreichen kann und wo jeder Interessierte über einen RSS-Feed sich über die neuesten Sachen informieren kann.

Einen ersten Prototypen habe ich fertig: http://perlnews.renee-baecker.de

Das ganze ist mit CGI::Application und HTML::Template::Compiled umgesetzt. Da ist natürlich noch einiges daran zu tun, aber ich denke es ist ein erster Anfang...

Wenn die TPF auf meinen Vorschlag eingeht, wird die Plattform an eine Mailingliste angeschlossen, so dass Nachrichten automatisiert weitergereicht werden können. Und es sind noch einige andere Sachen daran zu verbessern...

Tuesday, October 09, 2007

In 80 Tagen um die Welt - Tag 7

Mal wieder bin ich einen Tag zu spät, aber besser spät als gar nicht...

Nach einer Woche kommt Phileas Fogg nach Ägypten. Wie gut das Ägypten auf Englisch 'Egypt' heißt, das bringt zu einem Perl-Skript mit dem Namen egypt. Mit dem Skript kann man Graphen von Funktionsaufrufen in C-Programmen erstellen. Dazu benötigt man das Programm, Perl, gcc und Graphviz.

Wenn man alles installiert hat, kann man ein C-Programm (z.B.
#include

void hello(){
printf("Hallo Welt!\n");
}

int main(void){
hello();
return 0;
}
) mit der Option -dr kompilieren
gcc -dr hallo_welt.c
Dadurch wird eine RTL-Datei erzeugt, in diesem Fall heißt die hallo_welt.c.00.expand.

mit egyt hallo_welt.c.00.expand | dotty - kann man sich den Graphen dann anschauen...

Monday, October 08, 2007

In 80 Tagen um die Welt - Tag 6

Ich bin gestern das Modul schuldig geblieben, was ich hiermit nachholen möchte...

Phileas Fogg ist an Griechenland vorbeigereist, aber das Land hat ihn sicherlich beschäftigt - wenn man schon mal in der Nähe ist...

Um aber auf den Namen für das nächste Modul zu kommen, muss man schon einen Umweg gehen! Im Englischen heißt man "versteht nur Bahnhof" ganz einfach "It's all Greek to me" und Greek ist - richtig! Der englische Name für Griechenland. Jonathan Rockway hat für alle Programmierer - deren Kollegen sagen, dass man bei Perl nur "Bahnhof versteht" - ein Modul geschrieben, bei dem man wirklich nur Bahnhof versteht: Acme::Greek. Wie man an dem "Acme" sieht, ist es eher ein "Spaß-Modul".

Ähnlich wie Acme::Bleach oder Acme::Buffy und viele andere mehr verändert es den Sourcecode, aber das Perl-Programm funktioniert weiterhin. Ein Beispiel:
#!/usr/bin/perl

use Acme::Greek;
print "Phileas Fogg is on his way to Egypt\n";
So sieht das Skript aus, wenn man es programmiert hat. Beim ersten Programmaufruf "übersetzt" Acme::Greek den Quellcode in unleserlichen Kram:
use Acme::Greek;
#!/θσρ/βιν/περλ
πριντ "Πηιλεασ Φογγ ισ ον ηισ ςαυ το Εγυπτ\ν";
Toll, nicht?
Und wenn man das Programm dann ein zweites Mal ausführt, wird tatsächlich "Phileas Fogg is on his way to Egypt" ausgegeben.

Saturday, October 06, 2007

In 80 Tagen um die Welt - Tag 5

Auf dem Weg von Italien nach Ägypten muss Phileas Fogg über das Mittelmeer - beginnend in Brindisi, einer italienischen Hafenstadt. 1999 bin ich selbst von dort nach nach Griechenland gefahren - das waren einige Stunden Fahrt mit der Fähre. Diese Mischung bringt mich auch auf das heutige Perl-Modul... Auf der Fahrt kommt Phileas Fogg nahe an Griechenland vorbei. Um den Griechen seine Wette zu erklären, muss er die "80" Tage in eine Zahl umwandeln, die in griechischen Buchstaben geschrieben wird. Zum Glück gibt es das Modul Convert::Number::Greek!

Ein einfaches Beispielskript:
#!/usr/bin/perl

use strict;
use warnings;
use Convert::Number::Greek 'num2greek';use Encode;

my $number = 80;
my $greek = num2greek $number;
print $greek;
Wer das ausführt bekommt wahrscheinlich eine Warnung und das Ergebnis angezeigt. Die Warnung wird ungefähr so aussehen:
Wide character in print at skript.pl line 9.
Dieses Problem tritt dann auf, wenn man mit Unicode zu tun hat. Diese Warnung kann man auf zwei Wegen "abschalten"...

1.) Dem Filehandle mitteilen, dass der utf8-Layer verwendet werden soll, also einfach ein
binmode STDOUT, ':utf8';
vor der print-Anweisung.

2.) Mit dem Modul Encode arbeiten:
#!/usr/bin/perl

use strict;
use warnings;
use Convert::Number::Greek 'num2greek';
use Encode;

my $number = 80;
my $greek = num2greek $number;

$greek = encode_utf8( $greek );
print $greek;

Friday, October 05, 2007

In 80 Tagen um die Welt - Tag 4

Auch am vierten Tag der Reise ist Phileas Fogg in Italien unterwegs. Wäre er rund 135 Jahre später durch Italien gereist, hätte er sich mit Gianni Ceccarelli treffen können und über dessen Modul Template::Plugin::ASCIITable unterhalten können.

Wie man sieht, werde ich die Module nicht nur nach Region aussuchen sondern auch nach der Herkunft des Autors...

Mit Template::Plugin::ASCIITable kann man ziemlich einfach ASCII-Tabellen über Template-Toolkit erstellen. Intern verwendet das Modul Text::ASCIITable.

Ein kleines Beispiel-Template:
[% USE ASCIITable %]
[% ASCIITable.cols('a', 'b', 'c');
ASCIITable.rows([1,2,3],['one','two','three']);
ASCIITable.draw() %]
Und hier das dazugehörige Perl-Skript:
#!/usr/bin/perl

use strict;
use warnings;
use Template;

my $tt = Template->new();
$tt->process('template.tt');
Jetzt fragt sich sicherlich der Eine oder Andere, wofür man so ein Modul gebrauchen könnte. ASCII-Tabellen werden immer noch ganz gerne verwendet, wenn man keine Bilder irgendwo einfügen kann oder wenn es weiterverarbeitet werden soll. Genau hier hilft das Modul. Man muss sich nicht selbst um die Erstellung der Tabelle kümmern sondern kann sich darauf beschränken dem Template die Werte zu übergeben und der Rest passiert "automatisch".

Thursday, October 04, 2007

3. Frankfurter Perl-Community Workshop

Vom 26.-28.10. findet der 3. Frankfurter Perl-Community Workshop statt. Das ganze ist eine lockere Zusammenkunft mit einigen Vorträgen aber ganz ohne Zeitdruck und/oder Stress. Wer Lust hat, kann einfach vorbeikommen - und auf Grund des nicht ganz so großen Raums am besten unter http://wiki.perl-community.de/bin/view/Community/PlanungWorkshopOktober2007 eintragen. Oder hier sagen, damit ich es ins Wiki eintragen kann.

In 80 Tagen um die Welt - Tag 3

Als Phileas Fogg auf seiner Reise durch Italien kam, konnten diese mit seiner Perldokumentation recht wenig anfangen - alles auf Englisch, wo doch einige Leute auf dem Land nur relativ schlecht Englisch verstanden.

Mittlerweile ist das nicht mehr so tragisch. Enrico Sorcinelli hat mit dem Modul POD2::IT zumindest für einen kleinen Teil der Perldokumentation die italienische Übersetzung veröffentlicht.

Mit perldoc POD2::IT::perl bekommt man die italienische Fassung von perldoc perl.
NOME
perl - Practical Extraction and Report Language [Linguaggio Pratico di
Estrazione e Report, NdT]

SINOSSI
perl [ -sTuU ] [ -hv ] [ -V[:*variabilediconfigurazione*] ]
[ -cw ] [ -d[:*debugger*] ] [ -D[*numero/lista*] ]
[ -pna ] [ -F*pattern* ] [ -l[*ottale*] ] [ -0[*ottale*] ]
[ -I*directory* ] [ -m[-]*modulo* ] [ -M[-]*'modulo...'* ] [ -P ] [ -S ]
[ -x[*directory*] ] [ -i[*estensione*] ]
[ -e *'comando'* ] [ -- ] [ *filedelprogramma* ] [ *argomento* ]...

Se per voi il Perl Þ una novitÓ, dovreste iniziare con perlintro, una
introduzione per principianti che fornisce qualche informazione generale
per aiutarvi a consultare il resto dell'ampia documentazione.

Per facilitarne l'accesso, il manuale del Perl Þ stato suddiviso in
diverse parti.

In generale
perl Perl in generale (questa parte)
perlintro Introduzione al Perl per principianti
perltoc Sommario della documentazione del Perl
Das bringt mich natürlich zu einem weiteren Punkt: Joergen W. Lang hat das Projekt perldoc2 gestartet, das nicht nur die italienische Übersetzung liefern soll, sondern auch die deutsche Übersetzung (neben vielen weiteren Sprachen). Wer also des italienischen oder des deutschen mächtig ist und Lust hat, sollte sich mal bei Joergen melden. Er freut sich sicherlich...

Wednesday, October 03, 2007

Nützliche Variablen: $/

Im Forum tauchen immer wieder ähnliche Fragen auf und heute hatte ich wieder ne Mail im Postfach, bei denen es sich die Schreiber unnötig schwer machen. Da ich lange Zeit in dieser Ecke gearbeitet habe und die heutige Mail damit zu tun hatte möchte ich eine nützliche Spezialvariable in Perl mit einer FASTA-Datei erläutern.

FASTA-Dateien sind Dateien in einem bestimmten Format, in denen Sequenzdaten gespeichert sind - also mit Bioinformatik zu tun haben. Perl ist in der Bioinformatik eine weit verbreitete Programmiersprache und wenn man sich der Mächtigkeit von Perl bedient versteht man auch warum...

Diese FASTA-Dateien werden häufig eingelesen. Dabei möchte man meistens komplette Blöcke in ein Array schreiben. Also nicht Zeilenweise wie in den meisten Fällen in denen eine Datei eingelesen wird, sondern in benutzerdefinierten Blöcken.

Eine FASTA-Beispieldatei:
>gi|5524211|gb|AAD44166.1| cytochrome b [Elephas maximus maximus]
LCLYTHIGRNIYYGSYLYSETWNTGIMLLLITMATAFMGYVLPWGQMSFWGATVITNLFSAIPYIGTNLV
EWIWGGFSVDKATLNRFFAFHFILPFTMVALAGVHLTFLHETGSNNPLGLTSDSDKIPFHPYYTIKDFLG
LLILILLLLLLALLSPDMLGDPDNHMPADPLNTPLHIKPEWYFLFAYAILRSVPNKLGGVLALFLSIVIL
GLMPFLHTSKHRSMMLRPLSQALFWTLTMDLLTLTWIGSQPVEYPYTIIGQMASILYFSIILAFLPIAGX
IENY
>gi|1234567|gb|AAD44133.8| cytochrome a [Elephas maximus maximus]
LCLYTHIGRNIYYGSYLYSETWNTGIMLLLITMATAFMGYVLPWGQMSFWGATVITNLFSAIPYIGTNLV
EWIWGGFSVDKATLNRFFAFHFILPFTMVALAHTHLTFLHETGSNNPLGLTSDSDKIPFHPYYTIKDFLG
LLILILLLLLLALLSPDMLGDPDNHMPGLMITADSHIKPEWYFLFAYAILRSVPNKLGGVLALFLSIVIL
GLMPFLHTSKHRSMMLRPLSQALFWTLTMDLLTLTWIGSQPVEYPYTIIGQMASILYFSIILAFLPIAGX
IENY
In vielen Programmen sieht man dann so etwas:
#!/usr/bin/perl

my $fasta_file = '/pfad/zur/datei.fasta';
my @sequences;
my $sequence;
my $counter = 0;

open(FILEHANDLE, "<$fasta_file") or die $!; while( ){
if( $_ =~ /^>/ and $counter > 1 ){
push(@sequences, $sequence);
$sequence = $_;
}
$sequence .= $_;
$counter++;
}
push @sequences, $sequence if $sequence;
close(FILEHANDLE);

foreach(@sequences){
print "Sequenz: $_\n\n";
}

Das ist aber reichlich umständlich. Erstens gibt es schon Module wie etwas BioPerl oder Bio::FASTASequence oder wenn man es doch selbst machen will, sollte man die Sachen von Perl nutzen.

Es gibt eine Spezialvariable $/ (siehe auch perldoc perlvar), die das "Ende des einzulesenden Blocks" festlegt. Im Normalfall - wenn man also nichts verändert hat, ist die Variable auf "\n" gesetzt. Damit wird festgelegt, dass immer bis zu einem "\n" eingelesen wird.

Hier ist das zeilenweise einlesen aber eher ungeschickt. Wenn man sich die FASTA-Datei anschaut, sieht man, dass jeder Eintrag mit ">" an einem Zeilenanfang beginnt.

Also kann man $/ auf "\n>" setzen. Damit ist *ein* einzulesender Block durch ein Zeilenende-Zeichen und einem folgenden ">" begrenzt.

Somit kann man folgendes machen:
#!/usr/bin/perl

my $fasta_file = '/pfad/zur/datei.fasta';
my @sequences;

{
local $/ = "\n>";
open my $fh, '<', $fasta_file or die $!;
while(my $sequence = <$fh> ){
chomp $sequence;
$sequence = '>' . $sequence unless $sequence =~ /^>/;
push @sequences, $sequence;
}
close $fh;
}

foreach(@sequences){
print "Sequenz: $_\n\n";
}

Noch deutlicher wird es bei Dateien, bei denen die interessanten Blöcke durch eine Leerzeile begrenzt sind. Zum Beispiel:
Header1
Info1 zu Header1
Zeile2 der Info1

Header2
Info1 zu Header2
Zeile2 der Info1


Hier kann man $/ auf "\n\n" setzen und schon bekommt man bei jedem Durchlauf der while-Schleife beim Einlesen einen kompletten interessanten Block geliefert.

Aber man sollte aufpassen: Die Änderung von $/ sollte man auf einen möglichst kleinen Block beschränken. Deswegen habe ich oben auch um das Einlesen die geschweiften Klammern gepackt. Aber es gibt ein Problem wenn man *kein* local verwendet und innerhalb eines Programms erst eine FASTA-Datei dann eine andere Datei einlesen will...

chomp arbeitet übrigens auch mit $/, deswegen macht es in meinem Beispielcode auch das richtige und entfert das "\n>" bei jedem Eintrag...

In 80 Tagen um die Welt - Tag 2

Am zweiten Tag seiner Reise - dem 03.10.1872 - kam Phileas Fogg nach Frankreich. Dort hat rund 73 Jahre zuvor die Französische Revolution stattgefunden. Das bringt mich auch schon zum heutigen Perl-Modul - DateTime::Calendar::FrenchRevolutionary...

Jean Forget hat ein Modul geschrieben, mit dem man Daten aus dem Revolutionskalender in den Gregorianischen Kalender umrechnen kann - und natürlich auch in die entgegengesetzte Richtung. Der Revolutionskalender war zwar nur von 1793 bis 1805 in Kraft, aber das Modul ist dennoch eine gute Möglichkeit auf etwas einzugehen, das stark mit Frankreich zu tun hat.

In dem Beispielcode wird das Datum des zweiten Reisetages von Phileas Fogg in das entsprechende Datum des Französischen Revolutionskalenders umgerechnet:
#!/usr/bin/perl

use strict;
use warnings;
use DateTime;
use DateTime::Calendar::FrenchRevolutionary;

my ($day,$month,$year) = (3,10,1872);

my $date = DateTime->new(
day => $day,
month => $month,
year => $year,
);

my $french = DateTime::Calendar::FrenchRevolutionary->from_object(
object => $date,
);

my $greg_date = sprintf "%02d.%02d.%02d",
$day,
$month,
$year;

my $french_date = sprintf "%02d.%02d.%02d",
$french->day,
$french->month,
$french->year;

print qq~Das Datum $greg_date des Gregorianischen Kalenders
entspricht dem $greg_date
des Französischen Revolutionskalenders.~;

Tuesday, October 02, 2007

In 80 Tagen um die Welt - Tag 1

Sooo, heute beginnt die 80-tägige Reise aus "In 80 Tagen um die Welt" von Jules Verne. Jan Theofel hat die Aktion mit der täglichen Bloggerei initiiert. Er und zwei weitere Blogger werden ihre Einträge unter http://www.die-80-tage-blogger.de veröffentlichen. Ich werde die Reise mit einer losen Sammlung von Perl-Modulen begleiten.

Den Start möchte ich mit DateTime::Format::Natural::Lang::EN machen, da die Reise in London beginnt. Das Modul ist Teil der Distribution DateTime::Format::Natural. Damit lassen sich "natürlichsprachliche" Zeitangaben in ein "Kalenderformat" umwandeln.

Interessant wird es natürlich so richtig, wenn man es mit anderen Parsing-Techniken verbindet und so aus einem Fließtext viele Informationen sammeln kann. So könnte man das Modul - in Verbindung mit anderen Modulen - zum sogenannten Data-Mining verwenden...

Hier ein kleines Beispiel, wie man es machen könnte:
#!/usr/bin/perl

use strict;
use warnings;
use DateTime::Format::Natural;

my $string = 'today Phileas Fogg started his tour around the world';
my $parser = DateTime::Format::Natural->new(
lang => 'en',
);


my $date = "";
for my $word ( split / /, $string ){
my $dt = $parser->parse_datetime( $word );
next unless $parser->success;
$date = sprintf "%02d.%02d.%04d",
$dt->day,
$dt->month,
$dt->year;
}

print "Die 80-Tage-Blogger starten am $date\n";

Natürlich funktioniert das jetzt nur am heutigen Tag richtig. Also bräuchte man für ein sinnvolles Data-Mining noch einen Bezugspunkt dazu, was "today" ist...