| Perl-Basics | Perl-Enhanced | ||
|---|---|---|---|
Tips und Tricks zu Perl
Einzeiler für Directory-Dateien (LDIF)
Wenn man noch wenig oder keine Erfahrung mit Perl-Einzeilern hat, ist es hilfreich, sich meinen Vortrag "Perl in der Kommandozeile" durchzulesen, den man unter Fabiani -> Vorträge findet, weil ich hier nicht jedes Konstrukt und jede Option nochmal erkläre, und dort auch hilfreiche Informationen zu veschiedenen Betriebssystemen vorhanden sind. Fast alle Beispiele, die ich hier bringe, werden z.B. unter Unix/Linux so nicht funktionieren, weil dort die Shell manche Variablen schon vor der Übergabe an Perl ersetzt. In "Perl in der Kommandozeile" wird erklärt, wie man dies vermeiden kann.
LDIF-Datei zeilenweise bearbeiten
- LDIF-Dateien: Zeilen löschen
In einer LDIF-Datei sollen alle Zeilen, die wie folgt beginnen, weggeworfen werden: l:........
Für eine primitive Lösung kann man den Perl-Interpreter als Kommandozeilentool verwenden:perl -ne "print unless /^l:/i" datei1.ldif > datei2.ldif
- Diese Lösung hat folgende Schwäche: im LDIF-Format sind Zeilenumbrüche erlaubt, wenn die umgebrochene Zeile mit einem Leerzeichen beginnt. Diese einfache Lösung ignoriert jedoch Folgezeilen.
- LDIF-Dateien: Zeichen ersetzen
In einer LDIF-Datei soll die Zeichenkombination dc=mydomain durch dc=yourdomain ersetzt werden. Für eine primitive Lösung kann man den Perl-Interpreter als Kommandozeilentool verwenden:perl -ne "s|^dc=mydomain|dc=yourdomain|i; print" datei1.ldif > datei2.ldif
- Diese Lösung hat folgende Schwäche: im LDIF-Format sind Zeilenumbrüche erlaubt, wenn die umgebrochene Zeile mit einem Leerzeichen beginnt. Diese einfache Lösung würde es ignorieren, wenn dc=mydomaineinen Zeilenumbruch enthielte und in diesem Fall die Ersetzung nicht vornehmen.
LDIF-Datei objektweise bearbeiten
Bei LDIF-Dateien ist es jedoch oft nötig, nicht einzelne Zeilen, sondern komplette Objekte zu betrachten. Da zwischen zwei Objekten stehts eine Leerzeile stehen muß, kann man mit Perl-Mitteln einfach bestimmen, daß pro Schleifendurchlauf nicht eine Zeile, sondern ein komplettes Objekt eingelesen werden soll. Dies geschieht am einfachsten durch Setzen der Variable $/ auf zwei Zeilenumbrüche.
Achtung: unter verschiedenen Betriebssystemen ist der Zeilenumbruch oft anders; unter Unix/Linux ist er chr(10), unter Windows chr(13).chr(10), und unter Mac meistens chr(13). Ich verwende in den Beispielen die Windows-Zeilenendungen; wenn man also unter einem anderen Betriebssystem arbeitet, einfach die Zeilenumbrüche anpassen).
- Objekte filtern
Hier sollen alle Objekte ausgegeben werden, die als Attribut "employeeState: external" haben (alle anderen sollen herausgefiltert werden):perl -ne "$/=chr(13).chr(10).chr(13).chr(10); print if /^employeeState:\s*external/mi" datei1.ldif
Hier kann man auch die Schwäche der Lösungen von oben beheben, indem man die Folgezeilen durch s/\n //g herausfiltert:perl -ne "$/=chr(13).chr(10).chr(13).chr(10); s/\n //g; print if /^employeeState:\s*external/mi" datei1.ldif
- Objekte zählen:
Wenn man die Anzahl der Objekte zählen will, kann man dies mit dieser Methode recht einfach machen, und in einem END-Block dann die Anzahl ausgeben lassen:perl -ne "$/=chr(13).chr(10).chr(13).chr(10); $count++ if /^dn:/m; END{ print qq~Anzahl: $count\n~ }" datei1.ldif - Mögliche Werte eines Attributs auflisten
Auf dieselbe Art kann man alle möglichen Werte eines Attributs (hier employeeState) auflisten lassen:perl -ne "$/=chr(13).chr(10).chr(13).chr(10); @values=/^employeeState:\s*(.+)/mi; $count{$_}++ for @values; END{ print qq~$_ => $count{$_}\n~ for keys %count}" datei.ldif
Allgemeine Tips zum Umgang mit Directories
- LDAP-Suche in Directories optimieren
Wenn man in größeren Directories nach großen Datenmengen suchen will, kann dies etwas länger dauern und vom Directory Server unter Umständen eine Menge RAM verlangen. Effizienter sind meistens mehrere kleinere Abfragen, wo die Suchattribute bei der Suche angegeben werden, z.B. im ersten Durchgang sucht man nur nach allen dn's, und sucht dann für jede dn in einem weiteren Schritt die restlichen Attribute. - Daten in ein Directory schreiben
Wenn größere Datenmengen in einem Directory upgedated werden sollen, sollte man folgende Punkte beachten: 1. Ein Directory ist für Lesevorgänge optimiert, nicht jedoch für Schreibvorgänge, und 2. wenn in einem Directory was gelöscht wird, sind die Daten manchmal noch so lange im Directory vorhanden, bis die Garbagecollection sie endgültig rauswirft, also unter Umständen noch 1-2 weitere Tage. Deshalb sollte man möglichst nicht den kompletten Datenbestand löschen und wieder heu hinzufügen, sondern nach Möglichkeit Updates machen. - Die Modulgruppe Net::LDAP bietet eine einfache Möglichkeit, auf LDAP-Verzeichnisdienste
zugreifen zu können.
Letztes Update dieser Seite: Tuesday, 27-Jun-2006 20:37:01 CEST