2011-05-01T13:32:39
darkoZu den regulären Ausdrücken noch einmal: Kannst Du mir diese bitte kurz erklären?
In dem Zusammenhang: Werden diese nicht zwischen "/" eingeschlossen? Was bedeutet denn "m/"?
m ist der Match-Operator. Er überprüft, ob die angebene Regex auf den String "passt". Es ist Konvention, die Regex mit '/' einzuklammern.
In diesem Fall kann man meist das 'm' weglassen.
if /abc/; ist also eine Kurzschreibweise für
if $_ =~ m/abc/;
Andererseits kann man aber auch andere Klammern für die Regex verwenden. Das ist sinnvoll, wenn die Regex selbst '/' enthält (z.B. bei Pfadnamen).
dann braucht man die nicht immer zu escapen. Beispiel:
if m:/usr/bin:;
Hier wir die Regex durch ':' begrenzt, '/' ist ein ganz normales Zeichen, das gesucht wird.
2011-05-01T13:32:39
darkoKriegt das "=" eine Sonderbehandlung? Warum sind es genau zwei Variablen, die irgendwelche Werte bekommen? Vielen Dank im Voraus!
Dann zerlegen wir mal die Regex:
^ - matcht den Anfang des Strings
( ... ) markiert eine Gruppe. Der Inhalt wird $1, $2 etc. zugewiesen, dier erste Gruppe $1, die zweite $2 etc.
\s matcht ein Zeichen, das 'Whitespace' ist, also Leerzeichen, Tabs...
\S matcht ein Zeichen das
nicht \s ist, also alles außer Whitespace
+ matcht das vorhergehende Zeichen beliebig oft, mindestens aber einmal.
+? bedeutet nicht "greedy", also versucht die Regex-Engine den match möglichst kurz zu halten.
= matcht das Zeichen '='
^(\S+?)= matcht also einen String vom Anfang bis zum ersten '=' sofern er mindestens ein Zeichen enthält und kein Leerzeichen enthält. Der String vor dem '=' wird der Variablen $1 zugewiesen.
. matcht ein beliebiges Zeichen.
* ähnelt
+, nur das auch 0 Vorkommen gematcht werden.
$ matcht das Ende der Zeile.
(.*)$ matcht also den String von der aktuellen Position bis zum Ende der Zeile.
m/^(\S+?)=(.*)$/ matcht also eine Zeile, wenn sie mindestens ein '=' enthält, vor dem '=' mindestens ein Zeichen und kein Whitespace steht.
Der Teil vor dem '=' wird Variable $1, der Teil dahinter $2 zugewiesen.
Da $1 wohl der Name einer Environment-Variable sein soll, würde ich den
Teil
\S+? strikter fassen.
Deine Expression würde auch folgende Dinge matchen
== - die Variable hieße '='
@#$%*(&=abc - die Variable hieße '@#$%*(&'
etc.
Besser wäre
^([A-Z][A-Z_0-9]*?)=(.*)$.
Dann muss der Name mit einem Großbuchstaben beginnen und darf nur Großbuchstaben, Ziffern und Underscore enthalten.