Archive for the ‘Perl’ Category

h1

„underscored to camelCase“-Hack

Februar 21, 2009

Charly und ich müssen auf Arbeit gerade alten Code nach einigen Qualitätsstandarts überarbeiten. Dabei gilt auch, dass nun nur noch die camelCase-Methode verwendet wird. Bisher wurden aber sehr häufig Variablen nach der underscore-Methode benannt. Jetzt jede einzelne Variable im Editor zu ersetzen, wäre bei über 120 Dateien recht aufwändig geworden. Deswegen folgender Perl-Einzeiler:

perl -pi -e ’s/\$([\w]+?)_([\w]+)([\W])/\$$1\u$2$3/g‘ `find . -name „*.php“`

Das sucht alle PHP-Variablennamen, die einen Unterstrich enthalten, löscht den Unterstrich und ersetzt den darauf folgenden Buchstaben, mit dem gleichen Großbuchstaben. Sind in manchen Variablennamen mehrere Unterstriche vorhanden, so muss man den Befehl mehrmals ausführen, weil immer nur ein Unterstrich pro Aufruf pro Variablenname ersetzt wird.

Advertisements
h1

Perl rocks

Januar 30, 2009

Charly und ich haben die Aufgabe PHP-Code nach bestimmten Qualitätsstandards zu überarbeiten. Zum Beispiel dürfen für Variablennamen keine Abkürzungen verwendet werden. Man könnte jetzt also eine Datei nach solchen falschen Variablennamen durchsuchen und sie mit den Besseren ersetzen, indem man die Editor-Funktionen für globales Ersetzen verwendet. Das Problem ist, dass Variablen nicht nur in einer Datei verwendet werden, sondern teilweise überall im Projekt, verstreut in verschiedenen Dateien. Welcher Editor kann aber von Hause aus rekursiv in allen Dateien des Projekts Variablennamen ersetzen? Meiner jedenfalls – soweit ich weiß – nicht.

Eine Lösung ist Perl in Verbindung mit find:

perl -pi -e ’s/$schlechteVar/$guteVariable/g‘ `find . -name „*.php“`

Das ersetzt alle Vorkommen von ‚$schlechteVar‘ mit ‚$guteVariable‘ in allen Dateien unterhalb des aktuellen Verzeichnisses, die auf .php enden.

Eine weiterer Standard wurde festgelegt, der besagt, dass alle geschweiften Klammern auf eine einzelne Zeilen müssen. Also statt z.B. (wie eigentlich üblich):

if (Bedingung) { …

soll es so aussehen:

if (Bedingung)

{

Auch hier hilft wieder Perl! Diese beiden Befehle, sollten dafür sorgen, dass alle geschweiften Klammern auf einzelnen Zeilen landen:
perl -pi  -e ’s/([^[:blank:]]+?)[[:blank:]]*?{/$1\n{/g‘ `find . -name *.php`

perl -pi -e ’s/}[[:blank:]]*([^[:blank:]]+.*?\n$)/}\n$1/g‘ `find . -name *.php`
Wie gesagt: Perl rocks!
h1

XChat Plugins/Scripte

Januar 12, 2009

Da ich jetzt ab und zu auch mal im IRC mit XChat herumlunger, habe ich mal nachgeschaut, wie man sein XChat noch weiter anpassen und konfigurieren kann. Dabei bin ich darauf gestoßen, dass es Schnittstellen für 8 verschiedene Script- bzw. Programmiersprachen gibt (z.B. Python, Perl, C/C++).

Man kann sich also ein kleines Modul schreiben, dass dann auf bestimmte Nachrichten reagiert und vieles mehr – ok, so genau weiß ich es noch nicht =P

Die Dokumentationen und ein Überblick über die verfügbaren Implementierungen gibt es hier.

Und hier gibt es sogar einen ganzen Forumsbereich über XChat-Plugins und  Scripten.

h1

Kochbuch für alle Programmiersprachen (zb Python, Perl, Ruby, Groovy)

November 20, 2008

Okay, alle ist etwas übertrieben, aber interessant ist das „Pleac Project“ allemal, was soviel heißt wie „Programming Language Examples Alike Cookbook“. Ausgehend von dem Perl Kochbuch, wurden Programmbeispiele in diverse Programmiersprachen übersetzt. Noch kann auch mitgearbeitet werden, viele Sprachen sind erst zu einem kleinen Teil fertig. Allerdings gibt es ein vollständiges Perl Kochbuch online und ein nahezu vollständiges Python Kochbuch. Am besten ihr werft selbst einen Blick drauf.

>>http://pleac.sourceforge.net/

Diese Seite gehört von nun an definitiv zu meinen Standardonlinenachschlagewerken (was für ein Wort).

h1

Pennergame Bot – New version

November 13, 2008

Aufgrund von Nachfragen, ob ich die Installation nicht noch vereinfachen könnte, habe ich mich nochmal rangesetzt und das Script geändert und etwas vereinfacht. Allerdings hat es letztendlich so sehr viel nicht gebracht.

Also, ihr ladet euch von hier ActivePerl herunter, wie gehabt. Ihr müsst auf die heruntergeladene Datei doppelt klicken und den Installationsanweisungen folgen. Wenn ihr das nicht hinbekommt, fragt am Besten einen guten Freund, der mehr Ahnung von Computern hat. Aber ohne ActivePerl läuft das Programm einfach nicht, also müsst ihr das hinkriegen!

Ok, wenn das geschaft ist, ladet ihr mein Perl-Script von hier herunter. Das ist einfach eine Textdatei, die ihr irgendwo ablegt, wo ihr sie wiederfindet. Wichtig ist jedoch, dass der Dateiname mit .pl endet, sonst funktioniert es nicht! Speichert die Datei also zum Beispiel unter dem Namen spenden.pl ab.

Gut, eine Sache müsst ihr noch machen. Ihr legt in dem gleichen Ordner, wo auch die gerade heruntergeladene Datei ist, eine Textdatei mit dem Namen password.txt an. In diese Datei müsst ihr in die erste Zeile euren Benutzernamen vom Pennergame reinschreiben und in die zweite Zeile euer Passwort, damit sich das Script bei eurem Account einloggen kann und von dort aus spendet!

Jetzt müsst ihr nur noch, wenn ihr den über 2000 Leuten spenden wollt, doppelt auf die Perl-Datei klicken, die ihr vorher heruntergeladen habt (in meinem Beispiel die Datei spenden.pl). Dann sollte sich ein schwarzes Fenster öffnen, indem ihr einige Ausgaben seht, die selbsterklärend sein sollten. Der ganze Spendendurchlauf nimmt einige Zeit in Anspruch (je nach Auslastung des Servers), aber nebenbei könnt ihr ja andere Dinge tun und müsst das nicht beachten. Ist das Programm durchgelaufen, verschwindet das schwarze Fenster einfach wieder und ihr habt dann mehr als 2000 Leuten von eurem Account aus gespendet und solltet dadurch nach und nach ein paar Spenden zurück bekommen. 🙂

Wer mit der Anleitung nicht klar kommt, fragt am besten einen Freund, der Ahnung vom PC hat, oder ihr schreibt eure genaue Problemstellung hier als Kommentar rein und wartet auf Antwort.

Für Leute mit Programmiererfahrung gibt es hier das Script auch zum Anschauen mit Syntax-Highlighting.

h1

Benchmark regular Expressions

Oktober 31, 2008

Da ich schon vor kurzem einen Artikel über das Filtern von Text nach E-Mailadressen mithilfe von awk geschrieben habe, sind Charly und ich auf die Idee gekommen, zu vergleichen, welche Sprache oder welches Tool denn nun besser mit regulären Ausdrücken klarkommt. Dazu haben wir als Testobjekt eine Textdatei mit 720950 Zeilen genommen und haben mithilfe von regulären Ausdrücken alle E-Mailadressen aus der Datei gefiltert. Den Test haben wir mit awk, grep, Python und Perl durchgeführt.

Der Pythoncode:

#!/usr/bin/python
# Reads all lines from a file, validates email adresses
# as fast as it can
import re

file = open('sales10.txt')
pattern = re.compile('[-_.a-zA-Z0-9]*@[-a-zA-Z0-9]*\.[a-zA-Z]{2,9}')

for line in file.readlines():
  if(pattern.search(line)): pass;

Der grep-Befehl:

grep -c '[-_.a-zA-Z0-9]*@[-a-zA-Z0-9]*\.[a-zA-Z]\{2,9\}' sales10.txt

Damit grep nicht unötig lange ausgaben macht, die das Ergebnis erheblich verfälschen würden, verwende ich die Option -c, die nur am Ende die Anzahl der übereinstimmenden Zeilen ausgibt.

Das awk-Script:

{
    if ($0 ~ /[a-zA-Z\-_0-9\.]*@[a-zA-Z\-0-9]*\.[a-zA-Z]{2,9}/ )
    {
    }
}

Das Perlscript:

#!/usr/bin/perl -w

use strict;

while (<>) {
    if ( /[-_.a-zA-Z0-9]*@[-a-zA-Z0-9]*\.[a-zA-Z]{2,9}/ ) {
    }
}

Hier die Ergebnisse:

awk:       0m15.353s – 0m15.380s – 0m15.245s

Python:  0m5.091s – 0m4.986s – 0m4.994s

grep:      0m0.633s – 0m0.639s – 0m0.630s

Perl:       0m0.494s – 0m0.492s – 0m0.512s

Die Ergebnisse wurde mit dem Bashbefehl time ermittelt und sind von der schlechtesten zur besten Zeit sortiert. Erstaunlich ist vor allem, das grep nicht die besten Zeiten hat, obwohl es genau auf diese Aufgabe spezialisiert ist.