Die Transliteration - Nur ein Zeichen in einem Skalar ersetzen
Ich glaube, ich hatte dazu schon mal irgendwo in diesem Blog geschrieben, aber da ich das heute gerade mal brauchte und mich da etwas intensiver mit beschäftigt habe, möchte ich noch einen Artikel dazu schreiben.
Es ging um das Problem, nur ein Zeichen in einem Skalar zu löschen bzw. durch ein anderes zu ersetzen, und das natürlich möglichst schnell.
Leider ist das auch die rechenaufwändigste Variante, d.h. sie verbrät die meiste Rechenzeit.
Schneller ginge es schon mit index und substr, aber da das ein arges herumgewurschtel ist und nicht die schnellste Variante, möchte ich mir hier die Erläuterung sparen.
Dies scheint tatsächlich die schnellste Variante zu sein.
Sie ist der RegEx mit ~ s ja sehr ähnlich, tatsächlich wird aber laut Dokumentation die große mächtige RegEx-Maschinerie gar nicht verwendet, was sie wohl so schnell macht.
Und das ~ tr hat auch noch einige Parameter, die man sinnvoll einsetzen kann:
c (complement): Die erste Folge von Zeichen wird durch eine Folge aller Zeichen ersetzt, die in der ersten Folge nicht vorkommen (das Komplement der Zeichen-Menge)
d (delete): Alle Zeichen in der ersten Folge, für die es in der zweiten Folge keine Entsprechung gibt, werden im String gelöscht
s (squash): Ein mehrfach hintereinander auftretendes Zeichen wird nur einmal ersetzt
Wenn es also um das Löschen eines bestimmten Zeichens geht, so sollte man unbedingt die Variante
Wichtig ist aber zu beachten, daß hier zwischen Groß- und Kleinschreibung unterschieden wird, anders als in einer RegEx, bei der man bei Bedarf ein /i hinten anstellen kann.
Kommentare zum Beitrag "Die Transliteration - Nur ein Zeichen in einem Skalar ersetzen"
Kommentar von fw
> Wenn es also um das Löschen eines bestimmten
> Zeichens geht, so sollte man unbedingt die
> Variante $skalar=~ tr/a//;
Eben genau nicht, du hast es doch vorher schon geschrieben, dass man /d verwenden soll.
% perl -wE '$_="ab"; tr/a//; say'
ab
% perl -wE '$_="a"; tr/a//d; say'
b