Thread Zeilenweise aus Datei in Array lesen
(14 answers)
Opened by Patrick at 2004-01-14 08:48
[quote=Patrick,14.01.2004, 11:59]Sieht ja mega klasse aus, aber könntest Du mir mal ein bischen erzählen was da eigentlich steht!?
ich bin noch nicht so weit! :( besonders diesen Abschnitt Quote[/quote] > Sieht ja mega klasse aus, aber könntest Du mir mal ein bischen erzählen was da eigentlich steht!? Ich mach das mal :) Bei $array[0] =~ s#(\w+\s+=\s+)/.*#$1 . $string#e handelt es sich um einen sogenannten regulären Ausdruck (RE), der auf die Variable $array[0], also das erste Element des Arrays, angewendet wird. Der Ausdruck s#(\w+\s+=\s+)/.*#$1 . $string#e nimmt eine Substitution vor (deswegen auch das s an seinem Anfang, das Zeichen '#' dient hier als Trenner zwischen dem Suchteil und dem Ersetzungsteil (und dem Teil der danach folgt und wo man noch Optionen angeben kann, die die Ersetzung beeinflussen, wie im Beispiel die Option 'e'). Der Suchteil lautet hier (\w+\s+=\s+)/.*. Die Klammern "fangen" gefundene Teile, die man später in der Suche mit "\NUMMER" oder in der Ersetzung mit "$NUMMER" zitieren kann. \w steht für einen beliebiges Wortzeichen, es ist ungefähr so etwas wie a..z,A..Z,0..9,-,_ ... genau weiß ichs nicht auswendig, müsste ich nachsehen. Das Pluszeichen hinter dem \w gibt an, das ein bis beliebig viele dieser Wortzeichen vorkommen müssen. \s steht für (white)Space, also Leerzeichen, Tab, Zeilenumbruch, CarriageReturn, VerticalSpace (wars das? ich glaub ja), das Plus dahinter wieder für ein bis beliebig viele. Darauf muss das Zeichen '=' folgen, und wieder Whitespace. Dieser Teil wird gefangen. Danach muss noch das Zeichen '.' folgen (der Punkt steht normalerweise in einer RE für ein beliebiges Zeichen, deshalb muss er hier mit dem Backslash davor "escaped" - geschützt - werden. Genau das ist hier aber ein Fehler, denke ich, meint ist wohl .* statt \.*, da man den Rest ja ersetzen will. Nach dem beliebigen Zeichen kommt dann ein Stern, das bedeutet null bis beliebig oft. Da in dem String kein Punkt an dieser Stelle vorkommt, würde das "null mal" passen, und die RE würde den neuen Pfad vor den alten schreiben. Nimmt man den Backslash weg, müsste es funktionieren :D Ich würd den Ausdruck schreiben als Code: (dl
)
$array[0] =~ s#^(\w+\s+=\s+).*$#$1$string#; <!--EDIT|Crian|1074160319--> s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;
use strict; use warnings; Link zu meiner Perlseite |