Artikel im Internet unter http://www.hidemail.de/blog/substr-perl.shtml.
Donnerstag, 15.2.2007, 10:34:17 Uhr

substr() in Perl


Der Befehl substr, der eine Abkürzung des englischen Wortes Substring ist, liefert Teile eine Strings, oder Skalars, wie es in Perl heißt, zurück.
Der Syntax ist
$teil=substr($original,startpos,anzahlzeichen,ersetzungszeichen);


$t="Hanswurst";
print substr($t,0,4);
print " ";
print substr($t,4,5);


Ausgabe: Hans wurst

Es werden zuerst die ersten 4 Zeichen ausgegeben, dann 5 Zeichen ab Position 4, also wurst.
Vorsicht!
Die Zählung der Zeichen in einem Wort beginnt mit 0, nicht mit 1!

Beispiel: Hole die letzten zehn Zeichen eines Wortes oder Satzes oder einer Zeichenfolge:

$t="abcdefghijklmnopqrstuvwxyz0123456789";
$last_ten=substr($t,length($t)-10,10);
print $last_ten;


Ausgabe: 0123456789

Sie sehen, daß in Kombination mit length() erst die Länge des Skalars bestimmt werden muß, um die Startposition zu finden.

Übrigens:
Die letzten 10 Zeichen eines Skalars könnte man auch mit einer RegEx herausfinden:

$t="abcdefghijklmnopqrstuvwxyz0123456789";
$t=~ /.{10}$/;
print $&;


Ausgabe: 0123456789
Allerdings belastet die Version mit substr() den Server weniger und ist resourcenfreundlicher!

Man könnte jetzt zum Beispiel eine Funktion schreiben, die die letzten x Zeichen eines Skalars zurückgibt:

sub right{
my $skalar=shift;
my $zeichenanzahl=shift;
return substr($skalar,length($skalar)-$zeichenanzahl,$zeichenanzahl);
}



Der Aufruf würde dann folgendermaßen erfolgen:

$t="abcdefghijklmnopqrstuvwxyz0123456789";
$ergebnis=&right($t,10);
print $ergebnis;


Ausgabe: 0123456789

Prima, wie gewünscht! Diese Funktion ist universell einsetzbar, für viele verschiedene Problemstellungen geeignet, und sollte deswegen vielleicht in einer kleinen privaten Bibliothek nicht fehlen.

Aber substr() kann noch mehr:
substr() kann nicht nur Zeichen ab einer bestimmten Position finden, substr() kann dort auch gleich Zeichen ersetzen!

$t="Mein Name ist Hase";
substr($t,14,4,"Wolf");
print $t;


Ausgabe:
Mein Name ist Wolf

Ausgetauscht werden alle alten Zeichen der angegebenen Länge mit den neuen Zeichen. Ob die Länge der neuen Zeichen gleich ist, ist übrigens egal.


Verzeichnis auslesen und nur bestimmte Dateitypen zulassen
Nun, das gehört vielleicht nicht ganz hierher, aber da hier das substr eine wichtige Rolle spielt eben doch.

Man kann ja ein Verzeichnis einlesen mit

opendir ($DIR,'sonstwas');
@files=readdir($DIR);
close $DIR;

foreach (@files){
push (@dateien,$_) if ($_=~ /\.txt$/);
}

# in dateien sind jetzt alle Files mit der Endung .txt


Das Beispiel schiebt in das Array @dateien alle Dateien mit der Endung .txt. Funktioniert auch.

Schneller geht es aber dank substr():

opendir ($DIR,'sonstwas');
@files=readdir($DIR);
close $DIR;

foreach (@files){
push (@dateien,$_) if (substr($_,-4) eq '.txt');
}

# in dateien sind jetzt alle Files mit der Endung .txt


Der Code ist fast der Gleiche, aber die Prüfung auf das .txt geschieht hier mit substr() anstatt mit =~ /../. Das bringt einen Geschwindigkeitsvorteil vom Faktor 2, zumindest auf meinem Rechner.




Artikel im Internet unter http://www.hidemail.de/blog/substr-perl.shtml.