Einfachste Lösung für bedingte Zuweisung
Fink
- perl
Hallo
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.
Wie geht dies am einfachsten?
Schönen Abend
Fink
$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.
Was heißt im anderen Fall? wenn der Wert undefiniert ist oder wenn er nicht numerisch ist?
Struppi.
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.
Wenn es wirklich eine (aus Perl sicht) numerische Angabe handelt:
Scalar::Util::looks_like_a_number( $someval )
Eventuell erwartest du aber gar nicht diesen Umfang von numerischen Angaben.
In dem Fall führt dich die Lösung über eine Regex.
mfg Beat
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.
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;
mfg Beat
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
Hallo Alexander,
use 5.10;
...
my $xxx=$myhash{'element'}//0;
>
> $xxx wird 0, sobald $myhash{'element'} undefiniert ist oder nicht existiert.
was bedeutet das //? Entspricht das dem ||?
Danke
Fink
was bedeutet das //? Entspricht das dem ||?
http://perldoc.perl.org/perlop.html#C-style-Logical-Defined-Or
Struppi.
Hi,
ginge dann statt
my $xxx=$myhash{'element'}//0;
auch das für mich verständlichere
my $xxx = defined($myhash{'element'}) ? $myhash{'element'} : 0;
~~~?
Gruß
Fink
ginge dann statt
my $xxx=$myhash{'element'}//0;
> auch das für mich verständlichere
> ~~~perl
> my $xxx = defined($myhash{'element'}) ? $myhash{'element'} : 0;
>
~~~?
Ja, das ist das Gleiche wie der // Operator, aber warum nicht:
`my $xxx = $myhash{'element'} || 0;`{:.language-perl}
Das sollte im grossen und ganzen deine Anforderungen erfüllen. Wenn du nicht gleichzeitig auf eine gültige Zahl prüfen willst, genau das wollte ich dich schon [gestern](https://forum.selfhtml.org/?t=202014&m=1363772) von dir Wissen.
Struppi.
Das sollte im grossen und ganzen deine Anforderungen erfüllen. Wenn du nicht gleichzeitig auf eine gültige Zahl prüfen willst, genau das wollte ich dich schon gestern von dir Wissen.
Das hatte ich doch schon in dem zitierten Beitrag geschrieben:
"element1 kann numerisch oder undefiniert sein".
D.h. wenn es da ist, ist es (korrekt) numerisch
Gruß
Fink
Das hatte ich doch schon in dem zitierten Beitrag geschrieben:
"element1 kann numerisch oder undefiniert sein".
D.h. wenn es da ist, ist es (korrekt) numerisch
Dann reicht || aus.
Struppi.
Dank an alle Helfer!
Moin Moin!
ginge dann statt
my $xxx=$myhash{'element'}//0;
> auch das für mich verständlichere
> ~~~perl
> my $xxx = defined($myhash{'element'}) ? $myhash{'element'} : 0;
>
~~~?
Klar, das geht.
Nur ist a // b nicht exakt das gleiche wie defined(a) ? a : b, weil in der langen Form a zwei mal evaluiert wird. Bei Zugriffen auf Hash-Elemente sollte(\*) das harmlos sein, bei Funktionsaufrufen kann das auch mal schiefgehen:
~~~perl
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
sub doof
{
say "Hallo";
return 1;
}
my $xxx=doof() // 'bla';
say "xxx=$xxx";
my $yyy=defined(doof()) ? doof() : 'bla';
say "yyy=$yyy";
(*): "Sollte harmlos sein". Muß aber nicht. Spätestens mit Tied Hashes wird aus einem einfachen Lesezugriff ein Methodenaufruf.
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
{
package DoofHash;
# "You are not expected to understand this."
use Tie::Hash ();
our @ISA=qw(Tie::StdHash);
sub FETCH
{
say "Hallo";
$_[0]->SUPER::FETCH($_[1]);
}
}
my %hash;
tie %hash,'DoofHash';
$hash{'x'}='egal';
my $xxx=$hash{'x'} // 'bla';
say "xxx=$xxx";
my $yyy=defined($hash{'x'}) ? $hash{'x'} : 'bla';
say "yyy=$yyy";
Alexander