Aus Linux-Magazin 02/2014

CPAN-Neueingänge

© Duncan Noakes, 123RF.com

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.

Abbildung 1: Jeden Tag landen auf der Recent-Seite des CPAN etwa 50 neue Modulversionen – ein schlagender Beweis für eine aktive Community.

Abbildung 1: Jeden Tag landen auf der Recent-Seite des CPAN etwa 50 neue Modulversionen – ein schlagender Beweis für eine aktive Community.

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.

Abbildung 2: Das CPAN-Modul Speech::Google::TTS nutzt den hochentwickelten Sprachsynthesizer auf der Seite Translate.google.com.

Abbildung 2: Das CPAN-Modul Speech::Google::TTS nutzt den hochentwickelten Sprachsynthesizer auf der Seite 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();

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.

Abbildung 3: Das CPAN-Modul GraphViz::Makefile hat das Makefile aus <link href="#article_l2" class="listing" srcset=

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.

Abbildung 4: Das Skript »make2viz« zieht einige versteckte Module heran, wie Module::ScanDeps schnell herausfindet.

Abbildung 4: Das Skript »make2viz« zieht einige versteckte Module heran, wie Module::ScanDeps schnell herausfindet.

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.

Abbildung 5: Das Navigieren in sehr lange Dateilisten, hier im Homeverzeichnis des Perlmeisters Schilli, verlangt nach kreativen Mitteln.

Abbildung 5: Das Navigieren in sehr lange Dateilisten, hier im Homeverzeichnis des Perlmeisters Schilli, verlangt nach kreativen Mitteln.

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)

Der Autor

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 mailto:mschilli@perlmeister.com beantwortet er gerne Fragen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 3 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben