Villa Kunterbunt (Linux-Magazin, Februar 2014)

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.

Gesprochener Text

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

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();

Makefiles analysieren

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.

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

Abbildung 3: Das CPAN-Modul GraphViz::Makefile hat das Makefile in Listing 2 grafisch aufbereitet.

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;

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.

Süßes Geheimnis

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.

Fünf-Gänge-Menü

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.

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";

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.

Infos

[1]

Listings zu diesem Artikel: ftp://www.linux-magazin.de/pub/listings/magazin/2014/02/Perl

[2]

Liste aktuell eingeganger Versionen von CPAN-Modulen: http://search.cpan.org/recent

Michael Schilli

arbeitet als Software-Engineer bei Yahoo in Sunnyvale, Kalifornien. In seiner seit 1997 laufenden Kolumne forscht er jeden Monat nach praktischen Anwendungen der Skriptsprache Perl. Unter mschilli@perlmeister.com beantwortet er gerne Ihre Fragen.