Perl-Skripte parallelisieren
Wenn Perl-Code parallel ablaufen soll, könnte man das Skript mehrfach im Hintergrund starten. Es geht aber auch eleganter.
Das Perl-Modul Parallel::ForkManager bietet eine einfach anzuwendende Möglichkeit, Codeteile wie z. B. Schleifen zu parallelisieren. Dabei muss sich der Programmierer nicht um Threads oder ähnliches Zeug kümmern. Er muss nur angeben, an welcher Stelle im Code die Parallelisierung beginnen soll und wo sie enden soll. Zusätzlich muss noch darauf geachtet werden, dass der Vaterprozess erst beendet wird, wenn alle Kindprozesse terminiert haben.
Dem Konstruktor von Parallel::ForkManager kann die maximale Anzahl an parallelen Threads as Parameter übergeben werden.
Beispiel:
#!/usr/bin/perl
use Parallel::ForkManager;
my $m = new Parallel::ForkManager(4);
for(1..100) {
$m->start and next;
do_some_weird_calculations();
$m->finish;
}
$m->wait_all_children();
Im obigen Beispiel wird in einer Schleife hundert Mal die Prozedur do_some_weird_calculations aufgerufen. Dabei werden jeweils vier Aufrufe parallel ausgeführt. Nach erfolgreichem Aufruf von start springt der Vaterprozess mit next sofort zum nächsten Schleifendurchlauf weiter. Zum Schluss wird noch gewartet, bis alle Kindprozesse beendet sind.
Wenn parallelisiert auf eine Datenbank zugegriffen werden soll, muss die Datenbank-Verbindung innerhalb von start und finish jedesmal neu geöffnet werden. Die Verbindung außerhalb zu öffnen und alle Kinder auf diese Verbindung zugreifen zu lassen, funktioniert meist nicht.
Web-Forumulare per Skript absenden
Wenn man in einem Perl-Skript Web-Formulare ausfüllen muss, um bestimmte Informationen von einer Webseite herunterzuladen, bietet sich das Perl-Modul WWW::Mechanize an.
Dieses Modul simuliert einen ganzen Webbrowser und lässt den Skript-Programmierer durch Webseiten navigieren wie mit einem normalen Webbrowser. Einzig Javascript ist nicht möglich.
In unserem Beispiel loggen wir uns mit Benutzernamen und Passwort auf einer Webseite ein und laden von dort eine PDF-Datei herunter. Wir kennen den Namen der PDF-Datei nicht, aber wir wissen, dass es der einzige Link auf der Seite ist, der die Zeichenkette ".pdf" enthält, also suchen wir nach diesem Link. Zum Schluss speichern wir die PDF-Datei als "newest.pdf" ab:
#!/usr/bin/perl
use WWW::Mechanize;
my $mech = WWW::Mechanize->new();
$mech->agent_alias('Linux Mozilla');
my $username = 'ChuckNorris';
my $password = 'mypassword';
$mech->get('http://www.example.com/login');
$mech->submit_form(form_name => 'LoginForm',
fields => { UserName => $username, Password => $password });
my $link = $mech->find_link(url_regex => qr/.pdf/);
$mech->get($link->url());
$mech->save_content('newest.pdf');