Silvio: Perl: Einem Hash einen weiteren Hash zufügen

Hallo,

kann ich einem Hash %test1 einen anderen Hash %test2 zufügen und somit %test1 erweitern?

Probiert habe ich:

my %test1;
my %test2;
$test1{'a'} = 1;
$test1{'b'} = 1;
$test1{'c'} = 1;
$test2{'aa'} = 2;
$test2{'bb'} = 2;
$test2{'cc'} = 2;

%test1 = %test2;

Ein

print Dumper(%test1); 

bringt mir (klar, er überschreibt %test1 komplett) das hier

$VAR1 = {
          'cc' => 2,
          'aa' => 2,
          'bb' => 2
        };

Ich hätte aber gern:

$VAR1 = {
          'b' => 1,
          'a' => 1,
          'c' => 1,
          'cc' => 2,
          'aa' => 2,
          'bb' => 2
        };

Geht das durch irgeneine Art Zuweisungsoperator? Also ohne das ich eine Schleife bauen muss, um %test2 auszulesen und dann jedes Element einzeln %test1 zuweise?

Danke

  1. Kein Problem, es ist ganz einfach:

    %test1 = (%test1, %test2);
    

    Die Überschreibung findet von rechts nach links statt. Sozusagen ein hash_merge. MfG

    1. Vielen, vielen Dank! Wieder was gelernt :)

      1. Freut mich. Und weils so schön ist, nutzen wir das mal, um Argumente für Funktionen vorzubelegen:

        sub new{
            my $class = shift;
            my %cfg = (
                file => '', # full qualified
                lock => 0,  # atomar read+write
            @_);    
        
        }
        
        my $obj = Class->new( file => '/tmp/test', lock => 1);
        
        

        In diesem Kontext wird das Array @_ als Hash bewertet und die vorbelegten Schlüssel überschrieben. Schlüssel die erforderlich sind, werden natürlich nicht vorbelegt, sonder da wird geprüft ob sie beim Funktionsaufruf einen Wert bekommen haben. Übersichtlich, zweckmäßig und praktisch!

        MfG

        1. Darf ich das mal weiterspinnen bzw noch eine Frage dazu stellen?

          Meine Aufgabe aktuell ist es, für Onlinezahlungen die Schnittstelle zu entwickeln. Wir bieten zwei verschiedene Zahlungsdienstleister für den Kunden an.

          Es gibt zwischen den Zahlungsdienstleistern (ZD) Parameter, die die gleichen Werte von unserer Seite aus bekommen, wie bspw. der Preis und die Bestellnr., aber auch Parameter, die verschieden sind, wie bspw. eine Terminal-Id.

          Was auch dazukommt, dass die Parameter unterschiedlich heißen. Z.B. bei dem Preis, der bei ZD 1 "amount" , bei ZD 2 "value" heißt.

          Kann ich jetzt praktisch mit deinem Beispiel ein Objekt $payment generieren, dem ich in dem @_Array sowohl den angepassten Namen, wie auch entsprechenden Wert mit übergebe?

          Also in der Art

          sub new{
              my $class = shift;
              my %cfg = (
                  $name => 0, # full qualified
                  $name => 0,  # atomar read+write
                  $name => '',  # atomar read+write
              @_);    
          
          }
          
          my $paymentZahlungsdienstleister1 = Class->new( 'amount' => 100, 'orderId' => 441, 'terminalid' => 5566);
          my $paymentZahlungsdienstleister2 = Class->new( 'value' => 100, 'orderId' => 441, 'customerTerminalId' => '444-555');
          

          Oder denke ich hier zu kompliziert?

          Danke

          1. Oder denke ich hier zu kompliziert?

            Nene, Du denkst schon richtig und die Sache könnte dann so aussehen

            package ZD1;
            
            sub new{
               my $class = shift;
               my %cfg = (
                  value   => 0,
                  orderid => 123,
                  termid  => 456,
               @_);
            }
            
            
            package ZD2;
            
            sub new{
               my $class = shift;
               my %cfg = (
                  amount  => 0,
                  orderid => 123,
                  termid  => 456,
               @_);
            }
            
            

            Also bei dem einen heißt das eben amount und bei dem Anderen value. Und dann gibt es Eigenschaften die bei beiden gleich sind.... ich würde nur eine Klasse Zahldienstleister anlegen und in einer der Eigenschaften festhalten wie der heißt.

            MfG