Samstag, 12. Januar 2008

Perl 5.10: logical defined or //

Eine der Verbesserungen von Perl 5.10 ist der neue logische defined-or Operator //, der so ähnlich funktioniert wie der gute alte logische oder Operator ||.


$setting //= $DEFAULT;

macht genau dasselbe wie

$setting = defined $setting ? $setting : $DEFAULT;
oder

unless ( defined $setting ) {
$setting = $DEFAULT;
}

Es wird also nicht geprüft, ob $setting wahr ist, sondern ob $setting definiert ist.

In Perl wird jeder skalare Wert, der nicht zu Null (0) oder zur leeren Zeichenkette ('' bzw. "") evaluiert, als wahr interpretiert. Jeder skalare Wert, der nicht zu undef evaluiert, wird als definiert interpretiert. Null und die leere Zeichenkette sind daher logisch falsch aber definiert.

Beispiel:

use strict;
use warnings;

my $DEFAULT = 42;
my $setting = 0;

$setting ||= $DEFAULT;

setzt $setting auf den Wert von $DEFAULT, da 0 (Null) immer als logisch falsch interpretiert wird.

$setting //= $DEFAULT;

hingegen lässt 0 (Null), weil definiert, als Wert für $setting zu.

Eine elegante Lösung um den "0 ist kein wahrer Wert"-Bug zu vermeiden.

Siehe dazu auch:


Was ist eigentlich mit dor und err passiert?

Das Feature err bzw. dor, ein // (defined or) mit geringerer Präzedenz, welches in 5.9.4 noch implementiert wurde, ist in 5.10.0 nicht mehr vorhanden. Die Gründe dafür kann man der längeren Diskussion auf der p5p-Mailing-Liste entnehmen.

Die kurze Fassung:

  • err kann eine falsche Assoziation, z.B mit Fehler, bei Programmierern erzeugen.

  • In Perl 6 wird es keinen err sondern einen orelse Operator geben, der anders funktionieren wird als ein defined or mit niedriger Präzendenz





That's it.

Vorhergehende Artikel von mir zu den neuen Features und Verbesserungen in Perl 5.10:

Keine Kommentare: