/blog/perl


substr() in Perl
[120296 mal gelesen]
foreach in Perl
[110958 mal gelesen]
Arrays in Perl - Besonderheiten
[102557 mal gelesen]
open() - Dateien öffnen in Perl
[93836 mal gelesen]
chomp() in Perl
[80706 mal gelesen]
split() in Perl - Zeichenketten teilen
[79921 mal gelesen]
grep - Listen durchsuchen in Perl
[77990 mal gelesen]
push in Perl
[72826 mal gelesen]
sleep in Perl - Das aktuelle Script warten lassen
[56801 mal gelesen]
print in Perl
[47307 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 120297 mal gelesen.

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

SGN-Funktion für Perl

Skalare in Perl

Gefälschte Mail von Google enthält Trojaner

Select - Case in Perl

Google Sitemaps - Script zur Erstellung einer Sitemap-Datei für Google

The until-command in Perl

Die Perl-Blog-Software

pop() in Perl

Schande über mich - Ich habe PHP benutzt



0.0202500820159912 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: 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


Von: Sammy
Kommentar:
wie lautet denn die syntax wenn ich eine perl datei in einer perl datei öffnen will. also hier steht ja "|datei: " muss ich da noch ein ".pl" anhängen oder nicht?
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
21.9.2017

Es ist
19:10:29 Uhr

Ihre IP:
54.92.158.65

Blog-Einträge: 186

Die letzten 24 Stunden im Überblick


Gelesene Beiträge insgesamt:
3500345


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
123
45678910
11121314151617
18192021222324
252627282930

Impressum