Thread Newbie-Frage: map + %ENV hash
(7 answers)
Opened by darko at 2011-05-01 14:06 2011-05-01T13:32:39 darko 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 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. |