hotti: Hash an Unterfunktion

hi,

malne Nachfrage, weil ich lang nichts in Perl gemacht habe, ich will sowas:

test(a => 25, b => 33);

und habe in der sub:

  
sub test{  
 my %p = map{$_}@_;  
  
 # Vorbelegen  
 $p{a} ||= 'default';  
  
 print "$p{a}\n";  
}  

die sub gibt "25" aus, weil der key "a" mit einem Wert belegt ist. Ist er das nicht, wird "default" ausgegeben. Soweit sogut, -w meckert nicht, aber:

Ist das so ok vom Style her? Gibts da noch eine andere, evnt. elegantere Lösung?

Hotte

--
Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  1. Tach auch.

    [...]
    Ist das so ok vom Style her? Gibts da noch eine andere, evnt. elegantere Lösung?

    Wie wäre es, wenn du eine Referenz auf den Hash übergibst?

    Bis die Tage,
    Matti

  2. hi,

    malne Nachfrage, weil ich lang nichts in Perl gemacht habe, ich will sowas:

    test(a => 25, b => 33);

    Warum nicht

    test( { a => 25, b => 33 } );

    sub test{
      my $hasrref=shift;
      ...
    }

    sub test{
    my %p = map{$}@;

    Vorbelegen

    $p{a} ||= 'default';
    print "$p{a}\n";
    }

    
    > ...  
    > Ist das so ok vom Style her? Gibts da noch eine andere, evnt. elegantere Lösung?  
      
    Ja mit einer Hashreferenz.  
    Du hast dann immer noch die Freiheit, ob du auf originalen Daten oder auf einer Kopie arbeiten willst.  
      
    mfg Beat
    
    -- 
    
    ><o(((°>           ><o(((°>  
    
       <°)))o><                     ><o(((°>o  
    
    
  3. hi,

    also hashref... ok,

    dankende Grüße,
    Hotte

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  4. Moin Moin!

    test(a => 25, b => 33);

    sub test{
    my %p = map{$_}@_;

    Das map ist über.

      
      (my %p)=@_;  
    [/perl]  
      
    
    >  # Vorbelegen  
    >  $p{a} ||= 'default';  
    
    Schade, dass Perl Deine Kommentare nicht versteht.  
      
    Wenn Du Die Funktion mit a=>0 oder a=>'' aufrufst, wird $p{'a'} auf 'default' gesetzt. Das ist nicht immer das, was Du willst.  
      
    [code lang=perl]  
      $p{'a'}//='default'; # perl >= 5.10  
      $p{'a'}='default' unless defined $p{'a'}; # perl < 5.10  
    
    

    Und wenn auch undef erlaubt sein soll:

      
      $p{'a'}='default' unless exists $p{'a'}; # alle Versionen  
    
    

    Wenn Du wirklich eine Vorbelegung haben willst, weise die Default-Werte vor @_ zu und überschreibe dann mit @_:

      
      my %p=( a => 'default', @_); # Perl garantiert, dass der LETZTE Key gewinnt  
    
    

    Etwas Paranoia hinsichtlich der Anzahl der Elemente in @_ wäre auch nicht schlecht:

      
      @_%2 && die "Expected a hash"; # sonst gibt es 'Odd number of elements in hash assignment'  
    
    

    Der Weg über eine Hash-Referenz bietet sich in vielen Situationen ebenfalls an, die Variante oben nutze ich eigentlich nur für benannte Parameter.

    Alexander

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

      Vorbelegen

      $p{a} ||= 'default';
      Schade, dass Perl Deine Kommentare nicht versteht.

      Wenn Du Die Funktion mit a=>0 oder a=>'' aufrufst, wird $p{'a'} auf 'default' gesetzt. Das ist nicht immer das, was Du willst.

      Jes, bin selbst dahintergekommen am Rest des Abends ;-)

      defined und exists sind wieder meine Freunde geworden, ich hab nun alle Fälle damit abgedeckt. Btw., es werden in meinem Fall nicht nur scalare Übergeben, sondern auch weitere hash-Referenzen auf Veranstaltungen, Feiertage usw. (wenns fertig ist, wird das eine Terminverwaltung fürn Verein).

      Danke Dir für alle Hinweise, Alexander,

      Hotte

      --
      Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  5. Hi,

    weil Ihr mir hier so nett geholfen habt, dürft Ihr Euch die erste Anwendung meiner neuen Funktion hier mal angucken.

    Viel Spaß damit,
    Hotte

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.