Alexander (HH): Einfachste Lösung für bedingte Zuweisung

Beitrag lesen

Moin Moin!

Ich habe folgende Anweisung
$xxx = $myhash{'element1'};
element1 kann numerisch oder undefiniert sein.
Ich möchte den Wert aus dem Hash übernehmen, wenn numerisch, aber 0 zuweisen im anderen Fall.

Genauer: Entweder ist der Wert nicht vorhanden (undefiniert) oder er ist eine ganze, positive Zahl.

my $xxx = 0; #default
$myhash{'element1'} =~ /^(\d+)$/ and $xxx=$1;

Warum so umständlich?

use 5.10;  
# ...  
my $xxx=$myhash{'element'}//0;

$xxx wird 0, sobald $myhash{'element'} undefiniert ist oder nicht existiert.

Für ältere Perl-Versionen kann man nutzen, dass die Spezifikation für Werte von $myhash{'element'} sehr strikt ist: Positiver Integer oder undefiniert / nicht existent.

my $xxx=$myhash{'element'}||0;

$xxx wird 0, sobald $myhash{'element'} false ist. Scalare in Perl sind exakt dann false, wenn sie undefiniert, '', 0 oder '0' sind. Strings kommen per Definition nicht vor, ebensowenig die Zahl 0 (denn sie ist kein positiver Integer). Bleibt also als einziger Fall für false der undefinierte Wert, der nur in zwei Fällen auftreten kann: $myhash{'element'} existiert nicht oder $myhash{'element'} existiert und ist undef.

Selbst wenn man die Spezifikation auf nicht-negative Integer erweitert, funktioniert dieser Ansatz noch, allerdings kommt die 0 in $xxx dann streng genommen nicht aus $myhash{'element'}, sondern aus der 0 hinter ||.

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".