Thread Kommaseparierte Listen bereichsweise ausgeben. (28 answers)
Opened by Gast at 2006-04-14 16:54

murphy
 2006-04-15 05:29
#64965 #64965
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=sid burn,15.04.2006, 01:53][...]
Quote
Dies produziert mir: "Use of uninitialized value in pattern match (m//) at ./test.pl line 13, <LISTE> line 1". Muss ich immer unbedingt den "Umweg" über "@liste" machen?

EDIT:
Kleine verbesserung. Diese Fehlermeldung kommt, wenn du deinem Skript nicht jedes benötigte Argument übergibst. Es wird nämlich "$key" in deiner Regex interpoliert. Wenn du nicht alle Argumente übergibst, dann gibt es auch kein $key, daher solltest du bei sowas auch am anfang überprüfen, ob überhaupt genug Elemente übergeben worden sind. Die Anmerkung unten mit $1 stimmt aber immer noch sofern, als das du die Überprüfung mit $1 erst im if Block machen solltest.
/EDIT:

Das hast du deswegen, weil in deiner if bedingung auch gleichzeitig $1 vorkommt. Das $1 existiert aber nur dann, wenn deine Regex auch wirklich auf den String gematcht hat, und es einen Wert mit "()" auslesen konnte. Wenn deine Regex nicht matcht. Dann gibt es kein $1, und dann kommt natürlich auch die Fehlermeldung das er eine uninitialiserte Variable benutzt. Besser wäre es also, die Überprüfung ob $1 im richtigen bereich ist, nochmal innerhalb des if Blockes zu machen.
[...][/quote]
Vorsicht: Der Fehler liegt, wie ich auch in meinem letzten Beitrag sagte, daran, dass $_ durch den Befehl $_=shift(@_); auf undef gesetzt wird, weil @_ leer ist.

Der Fehler liegt nicht an der Interpolation von $key. Wäre $key undefiniert, so würde das zwar auch einen Fehler produzieren, aber die Fehlermeldung wäre dann "Use of uninitialized value in regexp compilation [...]" anstatt "Use of uninitialized value in pattern match (m//) [...]". Unbeschadet dessen ist es eine gute Idee zu prüfen, ob alle nötigen Kommandozeilenparameter übergeben wurden.

Der Fehler liegt auch nicht an der Verwendung von $1 in der if-Bedingung. Die if-Bedingung ist völlig korrekt. Zum einen würde ein undefinierter Wert in einem booleschen Kontext keine Warnung erzeugen, sondern den Wahrheitswert "falsch" repräsentieren und zum anderen werden logische Ausdrücke im Kurzschlussverfahren ausgewertet, weshalb alles nach && nicht ausgeführt wird, wenn nicht die Mustersuche Erfolg vermeldet.

(edit: emoticons deaktiviert)\n\n

<!--EDIT|murphy|1145064643-->
When C++ is your hammer, every problem looks like your thumb.

View full thread Kommaseparierte Listen bereichsweise ausgeben.