Thread Newbie-Frage: map + %ENV hash (7 answers)
Opened by darko at 2011-05-01 14:06

clms
 2011-05-01 17:02
#148172 #148172
User since
2010-08-29
373 Artikel
BenutzerIn
[default_avatar]
2011-05-01T13:32:39 darko
Zu 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 darko
Kriegt 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.

View full thread Newbie-Frage: map + %ENV hash