ein Kapitel zurück                                           ein Kapitel weiter

Die zweite Möglichkeit der Änderung des Operators für die Musterfindung führt im Gegensatz zum Kapitel zuvor, einen einfachen Erstatz von Zeichenfolgen durch eine andere Buchstabenfolge durch . Hier der Syntax........

$string =~ tr/SuchListe/ErsatzListe/;

Ein einfaches Beispiel : Sie wollen alle Buchstaben einer Textdatei die sie als Kommandozeilenargument mit dem Programm gestartet haben in Großbuchstaben umwandeln.............

#!/usr/bin/perl -w

use strict;

undef $/;
my $text=<>;

if($text =~ tr/a-z/A-Z/) {
         print $text , "\n";
        }


In diesem Beispiel wird jedes einzelne Zeichen von der Suchliste durch eines der Zeichen in ErsatzListe ersetzt.

Die Liste von Zeichen können sie auch wörtlich schreiben....

ABCDEF
A-F       #ABCDEF
A-CX-Z    #ABCXYZ
A-C0-9    #ABC0123456789


Hierzu noch ein paar Beispiele...

#!/usr/bin/perl -w

$text = "Dieser Text soll für Transliterationen missbraucht werden";
print $text , "\n";

$text =~ tr/a-z/A-Z/;   #alles in Grossbuchstaben
print $text , "\n";

$_ = $text;
$anzahl_T = tr/T/T/;   #Anzahl von dem Buchstaben T in $text
print "In diesem Text kommen $anzahl_T \"T\" 's vor!\n";

$anzahl_Space = tr/ / /;    #Leerstellen in $text
print "In dem Text sind $anzahl_Space Leerstellen vorhanden\n";


An diesem Beispiel können wir auch erkennen das tr/// im Skalaren Kontex (ohne ~) die Anzahl betroffener Zeichen zurückliefert. Vorrausgesetzt der Inhalt befindet sich in der Standartvariable $_

Natürlich können sie auch einzelne Zeichen löschen...

#!/usr/bin/perl -w

$text = "Dieser Text soll für Transliterationen missbraucht werden";

$text =~ tr/enl/ /#Buchstaben e n und l entfernen
print $text , "\n";


Was aber tun bei folgender Angabe...

$text =~ tr/abcd/ABC/;       

In diesem Fall werden alle Buchstaben "abcd" ersetzt duch "ABC". Aus "d" wird nun aber auch ein C. Um dies zu vermeiden gibt es das Flag /d das nichtersetzte Zeichen entfernt....

$text =~ tr/abcd/ABC/d; 

Weitere Flags und Ihre Bedeutung wären...

  • /s - Enstandene Duplikate aus der Ersetzung entfernen
  • /d - Nichtersetzte Zeichen entfernen
  • /UC - Konvertiert von Unicode nach Latin-1
  • /CU
  •  - Konvertiert von Latin-1 nach Unicode

Interessant dürfte es sein den Text von Latin-1 in Unicode und wieder zurück zu konvertieren. Alle 255 darstellbaren Zeichen die es gibt können sie so angegeben...

\0-\xFF

Hier das Beispiel dazu...

#!/usr/bin/perl -w

$text = "Ein häßlicher Text für Konvertierungen : üäöß";

$text =~ tr/\0-\xFF//CU;   #Latin1 -> Unicode
print $text , "\n";

$text =~ tr/\0-\x{FF}//UC;    #Unicode -> Latin1
print $text , "\n";


Wichtig ist es zu erwähnen das das Ersetzen mit tr/// schneller geht als mit s/// was für Internetanwendungen (CGI-Skripts) wichtig sein dürfte.

Fassen wir nochmals kurz zusammen.........

  • $string =~ m/suchstring/; #Suchen von Schlüsselworten
  • $string =~ s/suchstring/ersetztstring/; #Suchen und Ersetzten von Strings
  • $string =~ tr/suchliste/ersetztliste/; #Ersatz für einzelne Zeichenfolgen

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf