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!" (Friedrich Nietzsche möge verzeihen)
Es ist keine Frage, dass Perl als Programmiersprache an Bedeutung verloren hat. Kaum ein Jungspund hat mehr die Geduld, sich mit den zugegebenermaßen wunderlichen Eigenheiten der ehemals wohl dominantesten Skriptsprache herumzuschlagen. Statt dessen stiebt die Mehrheit seit Jahren in mehrere Richtungen davon.
Erstaunlicherweise ist aber die Produktionswut eingefleischter Perl-Hacker ungebrochen. Man sollte es nicht für möglich halten, aber es vergeht kaum ein Tag, an dem nicht 50 neue Modulversionen unter [2] auf dem CPAN auftauchen. In diesem Perl-Snapshot greife ich einige der besonders nützlichen sowie einige der unterhaltsamsten heraus, die in den letzten zwei Wochen das Licht der Perl-Community erblickt haben.
Abbildung 1: Jeden Tag gehen auf der "Recent"-Seite des CPAN etwa 50 neue Modulversionen ein. |
Geschriebenen Text in gesprochene Worte umzuwandeln, erfordert einen
sogenannten Sprach-Synthesizer, der einiges an Gehirnschmalz und Rechenpower
kostet. Statt sich selbst abzumühen, klinkt sich das CPAN-Modul
Speech::Google::TTS in die milliardenschwere Infrastruktur des Google-Konzerns
ein und zweckentfremdet dessen Website auf translate.google.com. Dort
bietet Google Wort-für-Wort-Übersetzungen eingetippter
Textphrasen an. Unten an der Textbox klebt allerdings auch ein
Lautsprecher-Symbol, und ein Klick darauf lässt eine Computerstimme
den eingetippten Text herunterrasseln. Das in Listing 1 verwendete
Modul schnappt sich die zurückkommenden Sounddaten und speichert sie
als .wav-Datei im /tmp-Verzeichnis ab.
Die Methode as_filename()
bringt den verwendeten Dateinamen ans Licht und der Aufruf des
"mplayer"-Binaries spielt den gesprochenen Text ab.
Die verwendete Sprache
stellt Zeile 7 auf 'de' also Deutsch ein, damit aus dem Lautsprecher
kein Denglisch mit amerikanischem Akzent dringt.
Wer also immer
schon einmal einen zäh laufenden Build-Job mit einem zackigen "Ende
der Kaffeepause, zurück zum Arbeitsplatz!" beenden wollte, kann es nun
programmatisch mit einem Skript tun. Das Modul erfordert außerdem
das Paket "mpg123", das sich auf Ubuntu mit "apt-get install mpg123"
problemlos installieren lässt.
Abbildung 2: Das CPAN-Modul Speech::Google::TTS nutzt den Sprach-Synthesizer auf translate.google.com |
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();
Wer ist nicht schon einmal vor einem komplizierten Makefile verzweifelt? Die Make-Syntax ist nicht gerade leserlich und wenn eine Target von weiteren drei anderen abhängt und sich dieser Rattenschwanz in die Länge zieht, ist es oft sehr mühsam, zu ergründen, wo der Fehler hängt. Das CPAN-Modul GraphViz::Makefile schickt sich deswegen an, die Abhängigkeiten zwischen den Make-Targets mit dem Paket GraphViz grafisch aufzubereiten.
Der Fairness halber sei gesagt, dass GraphViz::Makefile zur Zeit nur Spielzeug-Makefiles sauber darstellt, sobald die Syntax eine gewisse Komplexitätsgrenze überschreitet, sehen die erstellten Grafen aus wie ein von einem Tornado durchgewirbelter Heuhaufen. Aber das im Make-Tutorial http://mrbook.org/tutorials/make zu Schulungszwecken verwendete Makefile verarbeitet GraphViz::Makefile sehr ordentlich, wie der von Listing 3 erzeugte Graph in Abbildung 2 zeigt.
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
Abbildung 3: Das CPAN-Modul GraphViz::Makefile hat das Makefile in Listing 2 grafisch aufbereitet. |
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;
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 Grafen einer Target
zu erzeugen, nimmt die Methode generate()
in Zeile 9 den Namen der
Target entgegen ("all" in Listing 3), von der der Graph seinen Ausgang nimmt.
Bleibt anschließend nur noch, mit der Methode GraphViz->as_png()
den erzeugten Graphen als PNG-Bild abzuspeichern. Das Resultat ist dann
unter makefile.png
verfügbar (Abbildung 3). Ohne Frage steckt das
Modul noch in den Kinderschuhen, aber die Idee ist bestechend.
Oder die praktische Utility Module::ScanDeps: Oft kommt es vor, dass
ein Autor ein Modul oder Skript aufs CPAN stellt und vergisst, die
dabei verwendeten CPAN-Module als Abhängigkeiten anzugeben. Die Folge
sind fehlschlagende Installationen auf Fremdsystemen, die diese Module
nicht von Haus aus führen. Das CPAN-Modul Module::ScanDeps kommt mit einem
Skript scandeps.pl
daher, das als Argument ein Skript oder Modul
erwartet und die dort gefundenen Abhängigkeiten ausspuckt.
Auf das vorher vorgestellte Skript makeviz
mit
scandeps.pl makeviz
angewendet ergibt sich die Ausgabe in Abbildung 3. Wer hätte gedacht, dass tief im Bauch von GraphViz::Makefile über drei Ecken das Modul IPC::Run::Win32Helper zum Einsatz kommt? Offensichtlich wird es auf einem Linux-System zu unrecht eingebunden, aber würde es auf der Installationsplattform fehlen, wäre der Teufel los, denn Perl bräche das Skript ab.
Abbildung 4: Das Skript makeviz zieht einige versteckte Module heran, wie Module::ScanDeps schnell herausfindet. |
Kommandozeilen-Utilities erfordern manchmal User-Eingaben, und es existieren eine Reihe von Menü-Simulationen für Text-Terminals auf dem CPAN. In der Liste der neuen Modulversionen stach mir Text::Menus ins Auge, denn es bietet eine komfortabel zu programmierende Schnittstelle für den Fall an, dass der User einen Eintrag aus umfangreichen Listen auswählen muss.
Listing 4 zeigt ein Beispiel eines Skripts, das den User eine Datei aus dem unaufgeräumten Home-Verzeichnis des Autors auswählen lässt. Jahrelanges Aufschieben dringend notwendiger Aufräumarbeiten hat dazu geführt, dass dort 73 Dateien liegen, die nie auf eine Terminalseite passen würden. Wie Abbildung 5 zeigt, stellt Text::Menus jeweils 10 dar und lässt den User mit "d" runter- und mit "u" die Liste heraufscrollen.
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";
Abbildung 5: |
Durch Eingabe einer Zahl wählt der User einen Eintrag aus, der im Skript
menu
dann als Rückgabeparameter der Funktion pick()
in der Variablen
$selection
landet. Term::Menus bietet noch weitere Funktionen,
wie multiple Selektionen oder Untermenüs.
Sehr praktisch, und erstaunlich, wenn man bedenkt,
dass Skriptschreiber dies mit nur ein paar Zeilen Code erledigen können.
Es empfiehlt sich also durchaus, die "Recent"-Liste des CPAN regelmäßig auszusieben und nach Goldklümpchen zu suchen. Neben routinemäßigen Wartungs-Releases gängiger Module findet sich hin und wieder auch eine erstaunlich gute Idee zur Steigerung der Programmiereffizienz, oder schlichtweg unterhaltsames aus der skurrilen Welt der Perl-Community.
Listings zu diesem Artikel: ftp://www.linux-magazin.de/pub/listings/magazin/2014/02/Perl
Liste aktuell eingeganger Versionen von CPAN-Modulen: http://search.cpan.org/recent