/blog/perl


substr() in Perl
[154169 mal gelesen]
foreach in Perl
[129166 mal gelesen]
Arrays in Perl - Besonderheiten
[125383 mal gelesen]
split() in Perl - Zeichenketten teilen
[113579 mal gelesen]
open() - Dateien öffnen in Perl
[108991 mal gelesen]
grep - Listen durchsuchen in Perl
[94728 mal gelesen]
chomp() in Perl
[93643 mal gelesen]
push in Perl
[90859 mal gelesen]
sleep in Perl - Das aktuelle Script warten lassen
[75983 mal gelesen]
index() in Perl - Zeichenkette in Zeichenkette suchen
[59577 mal gelesen]


Arrays
Dateien
HTPC
Hashes
Leistungsoptimiert
PHP
Perl
RegEx
Schleifen
Script
Skalare
Sonstiges
System
Webserver
Zur Startseite


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.






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:

use Data::Dumper;
$s = 4711;
$s += 1; print Dumper($s);
$s .= 1; print Dumper($s);
$s += 1; print Dumper($s);


Einige Besonderheiten des Befehls 'substr' sind hier noch nicht erwähnt worden.

1. Um die letzten 10 Zeichen zu extrahieren reicht das Folgende völlig aus:

$last_ten = substr $t, -10;



2. Der dritte Parameter bestimmt bei negativen Werten die absolute Endposition von rechts gezählt:

$t='abcdefghijklmnopqrstuvwxyz0123456789';
print substr $t, -10, -1;
-> 012345678



3. Der Befehl darf gerne auch einmal links vom Gleichheitszeichen stehen:

$s = 'Aufwachen';
substr($s, 7) = 'sen';



Kommentar von Markus
Das Beispiel mit dem Ermitteln der letzten zehn Zeichen geht noch einfacher. Substr liest bei negativen Indexwerten automatisch von hinten.


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



Kommentar von nemo
<~~~><~~~>
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.



Thema: Perl Skalare

Der Beitrag "substr() in Perl" wurde 154170 mal gelesen.

Es wurde 37 x über diesen Beitrag abgestimmt.
Die durchschnittliche Beurteilung liegt bei
1.5 (1 = sehr gut - 6 = grottenschlecht).

Kommentar schreiben  Druckansicht  Seitenanfang 
Beurteilen 






 Zufällige Beiträge im /blog/perl

Speedtest File::Find

Schleifen mit for in Perl

Select - Case in Perl

values() - Alle Werte eines Hashes ermitteln

SGN-Funktion für Perl

utime - Zeitstempel von Dateien oder Verzeichnissen ändern in Perl

Datei durchsuchen mit Flip-Flop-Funktion

Doppelte Einträge aus Array entfernen in Perl

rmdir - Ein Verzeichnis löschen mit Perl



0.0305418968200684 sec. to build



...Blogsoftware in pure Perl - Powered by a lot of Coffee...


SSD-Festplatte - Wassn das???
Die Transliteration - Nur ein Zeichen in einem Skalar ersetzen
Select - Case in Perl
Windows 7 XP Mode – Wo finde ich den XP-Modus unter Windows 7?
Mac-Adresse beim Apple Macintosh herausfinden
SGN-Funktion für Perl

Eigene IP herausfinden mit Perl
Epoche live in Datum umwandeln
Firefox 3 - Exe-Files downloaden


Gesamtverzeichnis
Februar 2010
Dezember 2009
Oktober 2009
Januar 2009
Dezember 2008
November 2008
September 2008
August 2008
Juli 2008
Juni 2008
Mai 2008
April 2008
Januar 2008
Dezember 2007
November 2007
Oktober 2007
September 2007
August 2007
Juni 2007
Mai 2007
April 2007
März 2007
Februar 2007
Januar 2007
Dezember 2006


Mister Wong

RSS-Feed

Heute ist der
23.11.2024

Es ist
13:06:17 Uhr

Ihre IP:
18.222.163.231

Blog-Einträge: 186

Die letzten 24 Stunden im Überblick


Gelesene Beiträge insgesamt:
4423897


Webseiten vergleichen
Kalender mit Feiertagen - 2028
Links finden und testen
Menschliche Datumsangaben
IP zu Domain herausfinden
Time live in Datum umwandeln
Perl für Windows



Impressum