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);
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:
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.
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.
Kommentare zum Beitrag "substr() in Perl"
Kommentar von Guido Beckmann
Der Autor setzt einen String einem Scalar gleich. Ein Scalar ist allerdings kein String, sondern ein polymorpher Datentyp ähnlich dem MS OLE Datentyp VARIANT. Ein Scalar kann eine Zeichenfolge, einen numerischen Wert oder eine Referenz beinhalten. Die Konvertierung zwischen diesen (Unter-)Datentypen geschieht in der Regel transparent:
<~~~><~~~>
Ebenfalls erwähnenswert, auch wenn's implizit bei in einigen Beispielen drinsteckt: Der Parameter "anzahlzeichen" kann generell weggelassen werden. Das entspricht dann immer "bis zum Ende des Skalars".
print substr("unsinn", 2);
liefert demnach "sinn".
Kommentar von ich
gute seite
Kommentar von peter
ultra schnell Primzahlen berechnen.
#!/usr/bin/perl -w
#
#
#
#
use strict;
use warnings;
my $max = 5000000; # variable wird deklariert
my @sieb=(0..$max);
for my $i (2..($max/2)){
next unless $sieb[$i];
$sieb[$i*$_] = 0 for 2..int $max/$i;
}
# ausgabe
for my $i (2..$max) { print "$sieb[$i] \n" if $sieb[$i] }
exit 0;
probierts aus
Kommentar von Tape
Ganz schöner quatsch peter ;-)
dein script gibt definitv keine primzahlen aus..
Kommentar von Peter
@Tape
Doch es funktioniert.
Für das Programm wurde Das Sieb des Eratosthenes verwendet
Hier der Wiki link
http://de.wikipedia.org/wiki/Sieb_des_Eratosthenes
wenn du es ausprobierst siehst du dass es funktioniert, allerdings kann man glaube ich nur die ersten 5 Millionen Primzahlen ausgeben lassen, danach geht das Programm "Out of Mem".
Kommentar von Hummel
@ Peter
syntax error at primzahl.pl line 11, near "0 for "
Execution of primzahl.pl aborted due to compilation errors.