Schon viele mögen den Skript-Altvater Perl für tot erklärt haben. Doch sie irren, wie ein wirklich interessierter Blick auf die Neueingänge des Softwarerepository CPAN zeigt.
“Als Zarathustra aber allein war, sprach er also zu seinem Herzen: Sollte es denn möglich sein! Dieser alte Heilige hat in seinem Walde noch nichts davon gehört, dass Perl tot ist!” – frei nach Friedrich Nietzsche, er möge verzeihen.
Keine Frage, Perl als Programmiersprache hat an Bedeutung verloren. Kaum ein Jungspund bringt mehr die Geduld auf, sich mit den zugegebenermaßen wunderlichen Eigenheiten der früher führenden Skriptsprache herumzuschlagen. Seit Jahren wandert die Mehrheit in mehrere Richtungen davon. Das scheint die Produktionswut eingefleischter Perl-Hacker aber nicht zu beeinträchtigen. Es vergeht kaum ein Tag, an dem nicht 50 neue Modulversionen auf dem CPAN unter [2] auftauchen (Abbildung 1).
Dieser Perl-Snapshot greift einige der besonders nützlichen sowie einige der unterhaltsamsten heraus, welche die Perl-Community in den letzten zwei Wochen veröffentlicht hat.
Online PLUS
In einem Screencast demonstriert Michael Schilli das Beispiel: https://www.linux-magazin.de/2014/02/plus
The King’s Speech
Geschriebenen Text in gesprochene Worte umzuwandeln, das erfordert einen so genannten Sprachsynthesizer – algorithmisch ist das ganz klar die Oberklasse der Informatik, die viel Gehirnschmalz und Rechenpower kostet. Statt sich selbst abzumühen, klinkt sich das CPAN-Modul Speech::Google::TTS [3] in die milliardenschwere Infrastruktur des Google-Konzerns ein, indem es die Website http://translate.google.com zweckentfremdet. Dort bietet Google Wort-für-Wort-Übersetzungen eingetippter Textphrasen an.
Unten an der Textbox klebt ein Lautsprechersymbol, nach jedem Klick darauf diktiert eine Computerstimme den dort eingefügten Text (Abbildung 2). Das in Listing 1 verwendete Modul fängt den Sound ab und speichert ihn als Wav-Datei im »/tmp« -Verzeichnis. Die Methode »as_filename()« zerrt den zugehörigen Dateinamen ins Licht, und der Aufruf des Mplayer-Binary in Zeile 9 spielt den gesprochenen Text ab.
Die Vorlese-Sprache stellt Zeile 7 auf »de« ein, also Deutsch, damit aus dem Lautsprecher kein Denglisch mit amerikanischem Akzent quillt. Wer schon immer einen zähen Buildjob mit einem zackigen “Ende der Kaffeepause, zurück zum Arbeitsplatz!” akustisch beenden wollte – mit einem Skript bietet sich nun die Gelegenheit dazu. Das Modul erfordert außerdem das Paket Mpg123, das Ubuntu sich mit »apt-get install mpg123« problemlos zu Eigen macht.
Listing 1
text2speech
1 #!/usr/local/bin/perl -w
2 use strict;
3 use Speech::Google::TTS;
4
5 my $tts = Speech::Google::TTS->new();
6
7 $tts->{'lang'} = 'de';
8 $tts->say_text( "Ja was ist denn da los?!");
9 system "mplayer", $tts->as_filename();
Schwer für des Menschen Hirn: Makefiles analysieren
Wer ist nicht schon einmal vor einem komplizierten Makefile verzweifelt? Die Make-Syntax ist nicht gerade leserlich, und spätestens wenn ein Target von drei weiteren abhängt und jedes wiederum …, dann wird es sehr mühsam zu ergründen, wo der Fehler steckt. Das CPAN-Modul GraphViz::Makefile [4] macht sich auf, um die Abhängigkeiten zwischen den Make-Targets mit dem Paket Graphviz grafisch aufzubereiten.
Der Fairness halber sei gesagt, dass GraphViz::Makefile zurzeit nur Spielzeug-Makefiles sauber darstellt: Sobald die Syntax eine gewisse Komplexität überschreitet, gleichen die erzeugten Grafen einem von einem Tornado aufgewirbelten Heuhaufen. Aber das im Make-Tutorial [5] zu Schulungszwecken verwendete Makefile verarbeitet GraphViz::Makefile sehr ordentlich, wie der von Listing 3 erzeugte Graph in Abbildung 3 zeigt.

Listing 2 grafisch aufbereitet.” width=”300″ height=”224″ />
Abbildung 3: Das CPAN-Modul GraphViz::Makefile hat das Makefile aus Listing 2 grafisch aufbereitet.Listing 2
Makefile
01 all: hello 02 03 hello: main.o factorial.o hello.o 04 g++ main.o factorial.o hello.o -o hello 05 06 main.o: main.cpp 07 g++ -c main.cpp 08 09 factorial.o: factorial.cpp 10 g++ -c factorial.cpp 11 12 hello.o: hello.cpp 13 g++ -c hello.cpp 14 15 clean: 16 rm -rf *o hello
Listing 3
make2viz
01 #!/usr/local/bin/perl -w 02 use strict; 03 04 use GraphViz::Makefile; 05 06 my $gm = GraphViz::Makefile->new( 07 undef, "Makefile" ); 08 09 $gm->generate( "all" ); 10 11 open my $ofh, ">", "makefile.png" or 12 die $!; 13 print $ofh $gm->GraphViz->as_png; 14 close $ofh;
Der Weg zum PNG
Dazu nimmt der Konstruktor von GraphViz::Makefile in Zeile 7 erst ein optionales »GraphViz« -Objekt entgegen. Ist der Parameter auf »undef« gesetzt, erzeugt GraphViz::Makefile ein eigenes Graphviz-Objekt. Der zweite Parameter ist auf »Makefile« eingestellt, sucht sich also das Makefile aus dem aktuellen Verzeichnis heraus.
Um nun den Graphen eines Target zu erzeugen, nimmt die Methode »generate()« in Zeile 9 den Namen des Target entgegen (in Listing 2 ist das »all« ). Von hier beginnt der Graph seinen Weg. Am glücklichen Ende speichert die Methode »GraphViz->as_png()« den Graphen als »makefile.png« -Bild (Abbildung 3). Das Modul mag noch in den Kinderschuhen stecken, sein Konzept besticht schon jetzt.
Unsichtbare Dienerschaft
Perl-Programmierer, die ein Modul oder Skript aufs CPAN stellen, vergessen schon mal, die Abhängigkeiten zu anderen CPAN-Modulen anzugeben. Folglich schlägt die Installation bei allen Anwendern fehl, die auf ihren Systemen die abhängigen Module nicht durch Zufall schon eingebunden haben. Das CPAN-Modul Module::ScanDeps [6] beherbergt das Skript »scandeps.pl« , das als Argument ein Skript oder Modul erwartet und die darin gefundenen Abhängigkeiten ausspuckt.
Auf das eben in Listing 3 vorgestellte Skript mit
scandeps.pl make2viz
angewendet, ergibt sich die Ausgabe in Abbildung 4. Wer hätte gedacht, dass tief im Bauch von GraphViz::Makefile das Modul IPC::Run::Win32Helper einen Teil der Verdauung übernimmt?! Linux-Systeme binden es zweifellos zu Unrecht ein, fehlt es auf der Installationsplattform jedoch, würde Perl das Skript abbrechen.
Mehr-Gänge-Menü
In manchem Kommandozeilen-Utility fordert dessen Programmierer vom Benutzer etwas komplexere Eingaben ab. Für Perl offeriert CPAN etliche Textterminal-Menüsimulationen. In der Liste der neuen Modulversionen sticht Term::Menus [7] heraus, denn es bietet eine komfortabel programmierbare Schnittstelle für Fälle an, bei denen der User einen Eintrag aus umfangreichen Listen auswählen muss.
Listing 4 zeigt als Beispiel ein Skript, bei dem der Benutzer eine Datei aus einem Homeverzeichnis auswählen soll. Jahrelang unterlassene Aufräumarbeiten haben offensichtlich dazu geführt, dass dort 73 Dateien liegen. Die passen im Ganzen auf keine Terminalseite. Wie Abbildung 5 zeigt, stellt Text::Menus jeweils zehn Dateien dar und gestattet dem User mit [D] runter- und mit [U] die Liste heraufzuscrollen.
Durch Eingabe einer Zahl wählt der User schließlich einen Eintrag aus. Der landet im Skript »menu« dann als Rückgabeparameter der Funktion »pick()« in der Variablen »$selection« . Term::Menus bietet noch andere Funktionen, etwa Mehrfachauswahlen oder Untermenüs. Alles sehr praktisch, wenn man bedenkt, dass Skriptprogrammierer dafür nur ein paar Zeilen Code aufwenden müssen.
Listing 4
menu
1 #!/usr/local/bin/perl -w 2 use strict; 3 use Term::Menus; 4 5 my @files = sort glob "~/*"; 6 my $banner=" Please pick an file:"; 7 my $selection = pick( \@files, $banner); 8 print "You chose '$selection'\n";
Nuggets finden
Das Schlaglicht auf die CPAN-Recent-Liste einiger Tage zeigt, dass es sich durchaus lohnt, hier öfter nach Goldklümpchen zu sieben. Neben routinemäßigen Wartungsreleases gängiger Module glitzern am Boden der Pfanne immer wieder gute Ideen für mehr Programmier-Effizienz oder Unterhaltsames aus der Welt der sehr lebendigen Perl-Community.
“Mitschaffende sucht Zarathustra, Miterntende und Mitfeiernde sucht Zarathustra: Was hat er mit Herden und Hirten und Leichnamen zu schaffen!” (Friedrich Nietzsche)
Infos
- Listings zu diesem Artikel: ftp://www.linux-magazin.de/pub/listings/magazin/2014/02/Perl
- Aktuell eingegangene CPAN-Modul-Versionen: http://search.cpan.org/recent
- Speech::Google::TTS: http://search.cpan.org/~nielsd/Speech-Google-TTS-074/
- GraphViz::Makefile: http://search.cpan.org/~srezic/GraphViz-Makefile-1.17
- Make-Tutorial: http://mrbook.org/tutorials/make
- Module::ScanDeps: http://search.cpan.org/~rschupp/Module-ScanDeps-1.12/
- Term::Menus: http://search.cpan.org/~reedfish/Term-Menus-2.49/










