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".