/blog/perl


substr() in Perl
[129284 mal gelesen]
foreach in Perl
[117672 mal gelesen]
Arrays in Perl - Besonderheiten
[110972 mal gelesen]
open() - Dateien öffnen in Perl
[98862 mal gelesen]
split() in Perl - Zeichenketten teilen
[91384 mal gelesen]
chomp() in Perl
[85610 mal gelesen]
grep - Listen durchsuchen in Perl
[82861 mal gelesen]
push in Perl
[80102 mal gelesen]
sleep in Perl - Das aktuelle Script warten lassen
[62679 mal gelesen]
print in Perl
[50513 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".



Thema: Perl Skalare

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

Es wurde 36 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

Den absoluten Pfad eines Scriptes auf dem Server feststellen

values() - Alle Werte eines Hashes ermitteln

Feiertage eines beliebigen Jahres errechnen mit Perl

chomp() in Perl

Net::FTP unter Windows Vista

chdir - Aktuelles Arbeitsverzeichnis definieren

Windows 7 XP Mode – Wo finde ich den XP-Modus unter Windows 7?

redo - Schleife erneut durchlaufen

Mathematische Funktionen in Perl - atan2(), cos(), exp(), sin(), log(), sqrt()

Shift in Perl



0.061211109161377 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
truncate - Dateigröße verändern in Perl
Eigene IP herausfinden mit Perl
Epoche live in Datum umwandeln
Firefox 3 - Exe-Files downloaden


Von: Fabian
Kommentar:
Hallo zusammen,
ich suche schon etwas im Internet und bin bisher nicht fündig geworden.
Zum Beitrag


Von: Schorschel eastcoast
Kommentar:
Danke. Das hat mir weitergeholfen.
Zum Beitrag


Von: Jessica
Kommentar:
Kann man auch zwei Datein parallel einlesen?

Zum Beitrag


Von: Xtravaganz
Kommentar:
Für

Zum Beitrag


Von: Xtravaganz
Kommentar:
Für

Zum Beitrag



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
16.12.2018

Es ist
7:21:28 Uhr

Ihre IP:
54.82.10.219

Blog-Einträge: 186

Die letzten 24 Stunden im Überblick


Gelesene Beiträge insgesamt:
3753383


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



Mo Di Mi Do Fr Sa So
12
3456789
10111213141516
17181920212223
24252627282930
31

Impressum