Es gibt zwei unterschiedliche Vergleiche.
Einmal den String vergleich und einmal einen Zahlenvergleich. Beide sind unterschiedlich und du selber musst sagen was du haben möchtest. Die Operatoren die aus Zeichen bestehen sind für Zahlenvergleiche gedacht.
==, >=, <=, !=
Die Operatoren die aus Buchstaben bestehen sind für String Vergleiche.
eq, gt, lt, ne
Wenn du einen Operator für einen Zahlenvergleich nutzt dann werden beide Variablen auf jeder Seite zuerst in Zahlen umgewandelt und dann miteinander verglichen.
'z' == 0
bedeutet also das das 'z' in einer Zahl umgewandelt wird. Bei der Umwandlung von Strings nach Zahlen geht perl so das die ersten Zahlen im String als Zahl betrachtet werden. Kommt am anfang keine Ziffern vor wird daraus automatisch eine 0.
Daher vergleichst du hier in echt 0 == 0 was natürlich wahr ist und somit wird dein if block ausgeführt.
warnings solltest du definitiv an lassen. Weil dir Perl eben ein warning ausspuckt wenn du eine Variable umwandelst die nicht 100%ig als Zahl darstellbar ist.
da du selber ja eher ein String vergleichen möchtest oder ein Passwort wäre hier ein 'eq' Korrekt.
'z' eq 0
Hier würde er beides zuerst in einem String umwandeln. Ein vergleich mit eq wirft nie ein warning. Hier vergleicht er also "z" mit "0" und das ist natüprlich unwahr.
Im übrigen würde ich jetzt nicht auf die Idee kommen überall eq zu verwenden. Du musst das richtige nehmen je nachdem ob du eine zahl oder einen String vergleichst. Wenn eq für Zahlen vergleich nutzt wäre das auch falsch, und es kommt nichtmal ein warning.
Kurzes beispiel hierfür. Stell dir vor du fragst den benutzern zwei zahlen einzugeben und du überprüfst danach ob die Zahlen gleich sind.
Der Nutzer gibt einmal "0" und einmal "0.0" ein. Als Zahl verglichen sind beide Sachen identisch da sie eben "0" sind. Als String verglichen sind sie inkorrekt. Da du den String "0" der ein zeichen groß ist mit einem String Vergleichst der drei Zeichen groß ist. Und aus einer Null + Punkt + Null besteht.
Ich hoffe der Unterschied wird dir jetzt klar.
Diese Unterscheidung haben zu können ist dementsprechend auch wichtig.
Bei größer/kleiner Vergleichen wird es sogar noch deutlicher wenn du die Falschen Operatoren nutzt. Beispielsweise ist
2 gt 1234567
wahr. Den die zwei kommt nach der 1. Das ist das Gleiche als wenn du du Wörter einordnest "b" kommt auch nach "auto".
Wenn du >= nutzt ist 2 >= 1234567 natürlich falsch da die Zahlen eben auch als Zahlen angesehen wird.
Nur zum Flamen:
PHP kennt sowas nicht. Wenn du eine "0" eingibst wird eine Konversion zu einer zahl auf beiden Seiten gemacht. Es gibt keine warnings weder kannst du erzwingen das es Strings oder Zahlen vergleichen soll. ;)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de