Halihallo Andreas (kleiner Nachtrag)
defined musst du wohl besser durch length ersetzen, da split vielleicht ein "" statt einem undef ausgibt => next unless defined wird gar nie ausgeführt...
Wenn du folgendes splittest:
philipp|hasenfratz|philipp.ha@gmx.net||50|100
durch split /|/
@tmp = ( 'philipp', 'hasenfratz', 'philipp.ha@gmx.net', '', '50', '100');
das '' in der Mitte ist _nicht_ undef, sondern '' (leerer String).
Dies kannst du mit unless ($_) ausfiltern, jedoch nicht mit unless (defined $_). Defined liefert dir ein Boolean TRUE, wenn es wirklich undef ist, jedoch FALSE, wenn es '' oder 0 ist. Bei unless ($_) liefert dir die Bedingung TRUE, wenn $_ entweder undef oder '' oder 0 ist. Das ist der Unterschied. Du hast auch die Möglichkeit über unless length, da dann $_ als String behandelt wird (achtung aus 0 wird '0' und hat auch eine Länge!) und somit '' die Länge 0 hat => FALSE => next. In deinem Zusammenhang ist also undef length; die richtige Bedingung (auch in Anbetracht, dass Artikel eventuell den Preis 0 haben und somit die Bedingung eben auch TRUE liefern muss, was length tut, da 0 eben '0' und die Länge 1 hat)
Zurück zum splitt: Warum sollte er auch undef liefern? - Das wär ja im Kontext auch völlig falsch. Die Zeichenkette zwischen || ist ja _nicht_ undef, sondern ein _leerer_ String, undef wäre einfach falsch.
Wenn wir schon dabei sind: Ich weiss nicht genau, wie es in php geht. Seit der 4-er Version gibt's ja auch den Boolean als Typ, was es in Perl nicht gibt. Booleans haben die Werte TRUE und FALSE. In Perl musst du folgendes wissen:
die Werte undef, '' und 0 sind FALSE, alles andere TRUE (also auch '0' im String-Kontext). Das ist sozusagen die Implementation (oder wohl etwas besser: Emulation) des Boolean Datentyp in Perl.
if ($_) { ... }
dann wird { ... } also nur ausgeführt, wenn $_ einen der Werte undef, '' oder 0 hat. Wobei if (defined $_) { ... }, { ... } explizit _nur_ dann aufruft, wenn $_ _genau_ den Wert undef hat (bei '' oder 0 wird FALSE zurückgegeben).
Dies düfte für dich als php-Umsteiger noch wichtig zu wissen sein. Ich glaube, dass dies auch oft die Ursache von "komischen" Phänomenen ist...
Viele Grüsse
Philipp