Fink: Einfachste Lösung für bedingte Zuweisung

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

  1. $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.

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

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
    1. 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.

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

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        Der Valigator leibt diese Fische
        1. 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".
          1. 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
            
            1. was bedeutet das //? Entspricht das dem ||?

              http://perldoc.perl.org/perlop.html#C-style-Logical-Defined-Or

              Struppi.

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

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

                      1. Dank an alle Helfer!

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

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