Allack: Ineinander verschachtelte Variablen

Hallo!!

Ich möchte ein Perl- Programm schreiben, in dem an einer bestimmten Stelle ein Hash aufgerufen wird. In diesem Hash soll eine skalare Variable sein, also als Teil des Namens. Ich habe mehrere Hashes, die ähnlich heißen, also bsp.:

%A_12
%A_13
%B_12
%B_13

Dann kommt eine Abfrage, die in der Variablen $gruppe den Wert 'A' oder 'B' speichert, je nach dem, was ausgewählt wurde. Nun möchte ich, dass ich die Hashes so aufrufen kann:

%$gruppe_12

Aber: Das geht nicht... Ich hatte es schonmal irgendwie geschafft, das es so gekleppt hat, weiß aber nicht mehr wann und wo und ob das überhaupt Perl war...

Was kann ich tun, damit ich die skalara Variable $gruppe innerhalb eines Hashes verwenden kann? Vielen Dankl für alle Hilfen!!

Gruß, Allack

  1. hallo,

    Was kann ich tun, damit ich die skalara Variable $gruppe innerhalb eines Hashes verwenden kann?

    Ich bin mir nicht ganz sicher, ob ich dich richtig verstanden habe. Aber grundsätzlich ist es möglich, Variablen innerhalb anderer Variablen zu notieren. Es kommt dabei auf die Reihenfolge an, in der deine Variablen im Script oder in einer Funktion notiert werden.

    Beispiel:
    $a = "hallo Welt!";
    $b = "Ich habe grade ".$a." gesagt";
    print $b."\n";

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. Mir ist klar, dass ich Variablen im Wert einer anderen Variable problemlos anwenden kann. Mein Problematik ist das Anwenden einer Variablen im Namen einer anderen, also beispielsweise:

      gegeben ist die Variable $b

      sie soll Bestandteil einer anderen Variablen sein:

      $a$bc

      dabei ist die Variable in drei Teile geteilt. Einmal den Teil vor der Variablem $b (also a), in $b und den rest (also c)

      Danke trotzdem!

      1. hallo,

        gegeben ist die Variable $b
        sie soll Bestandteil einer anderen Variablen sein:
        $a$bc

        Das würde man eigentlich mit einem Array lösen.

        Grüße aus Berlin

        Christoph S.

        --
        Visitenkarte
        ss:| zu:) ls:& fo:) va:) sh:| rl:|
      2. Hell-O!

        gegeben ist die Variable $b
        sie soll Bestandteil einer anderen Variablen sein:
        $a$bc

        Dann verwende symbolische Referenzen. Kleines Beispiel:

        #!/usr/bin/perl  
          
        $boo = 'boo';  
        # Zusammensetzen des Variablennamens  
        $varname = $boo . 'bar';  
        # Deklarieren der Variable $boobar  
        ${$varname} = 'blubb';  
          
        # Ausgaben zur Kontrolle  
        print "Content-type: Text/plain\n\n";  
        print $boobar;
        

        Beachte bei diesem Vorgehen die Hinweise in perlref.

        Siechfred

        --
        Hier könnte Ihre Werbung stehen.
        Schöne Wörter, Teil 1 || Geld stinkt nicht
        1. Hallo Siechfried!

          Hab das jetzt mal genauso probiert, wie du mirs beschrieben hast:

          # $test ist leer
           # $ $gruppe = 'B'
           # %B11 ist bereits deklariert
           # $B11{place} = 'Frankfurt'

          $test = $gruppe . '11{place}'; # also $test = B11{place}
           print "<br><br>${$test}";
           print "<br><br>$B11{place}";

          Die Ausgabe für dieses Testscript müsste wie folgt sein:
           "

          Frankfurt

          Frankfurt"

          Leider erscheint aber folgendes:
           "

          Frankfurt"

          Ich bin absolut ratlos...

          Gruß Allack

          1. Hell-O!

            $test ist leer

            $ $gruppe = 'B'

            %B11 ist bereits deklariert

            $B11{place} = 'Frankfurt'

            Soweit klar.

            $test = $gruppe . '11{place}'; # also $test = B11{place}

            Das geht so nicht. Hast du die von mir verlinkte Seite tatsächlich gelesen? Du musst Perl schon mitteilen, was Inhalt deiner symbolischen Referenz sein soll. Auf dein Beispiel übertragen:

            @gruppen = ('A', 'B', 'C');  
            @keys = ('place', 'date', 'event');  
              
            foreach $gruppe(@gruppen) {  
              $varname = $gruppe . '11';  
              # ${$varname} = {};  
              foreach $key(@keys) {  
                ${$varname}{$key} = '1';  
                print '$'.$varname.'{'.$key.'} = '.${$varname}{$key}."\n";  
              }  
            }
            

            Eine richtig schöne Lösung ist das allerdings nicht, und da ich nicht so recht weiß, worauf du hinauswillst, kann ich dir im Moment auch nicht weiterhelfen.

            Siechfred

            1. Eine richtig schöne Lösung ist das allerdings nicht, und da ich nicht so recht weiß, worauf du hinauswillst, kann ich dir im Moment auch nicht weiterhelfen.

              Er will eigentlich ein Array benutzen (wie meistens bei solch einer Fragestellung)
              https://forum.selfhtml.org/?t=125754&m=811709
              (die fehlenden Kommas stammen aus dem Orginaposting)

              Struppi.

              1. Hell-O!

                Eine richtig schöne Lösung ist das allerdings nicht, und da ich nicht so recht weiß, worauf du hinauswillst, kann ich dir im Moment auch nicht weiterhelfen.
                Er will eigentlich ein Array benutzen (wie meistens bei solch einer Fragestellung)
                https://forum.selfhtml.org/?t=125754&m=811709
                (die fehlenden Kommas stammen aus dem Orginaposting)

                Hm, sieht eher so aus, als ob er eine Hash-Struktur kopieren will, oder nicht? Falls ja, wäre auch ein Hash-Slice denkbar:

                my @keys = ('place', 'date', 'event');  
                my @values = ('Erfurt', '01.04.2006', 'Aprilscherz');  
                my %hash;  
                # Hash-Slice ohne Wertzuweisung  
                @hash{@keys} = ();  
                # Hash-Slice mit Wertzuweisung  
                @hash{@keys} = @values;
                

                Überschüssige Werte aus @values werden abgesäbelt, fehlende ignoriert.

                Siechfred

                --
                Hier könnte Ihre Werbung stehen.
                Schöne Wörter, Teil 1 || Geld stinkt nicht
  2. Ich möchte ein Perl- Programm schreiben, in dem an einer bestimmten Stelle ein Hash aufgerufen wird. In diesem Hash soll eine skalare Variable sein, also als Teil des Namens. Ich habe mehrere Hashes, die ähnlich heißen, also bsp.:

    %A_12
    %A_13
    %B_12
    %B_13

    Wieso verwendest du keine Arrays?

    Struppi.

    1. Ich verwende keine Arrays, weil mein Vorhaben mit Hashes leichter zu handhaben ist, da ich dabei Keys anlegen kann, um die entsprechenden Values aufzurufen. Und ich habe 48 Hashes mit gleichen Keys, je 5 Stück, aber immer unterschiedlichen Values. Somit würd ich mir nur Komplizitätn schaffen, wenn ich Arrays benutzen würde...

      Wenn das nicht geht mit der Verschachtelei dann muss ich wohl über einen Umweg an mein Ziel kommen, wodurch mein Programm am Ende sehr viel größer wird als wenn es so ginge...

      Aber trotzdem Danke!

      1. Ich verwende keine Arrays, weil mein Vorhaben mit Hashes leichter zu handhaben ist, da ich dabei Keys anlegen kann, um die entsprechenden Values aufzurufen. Und ich habe 48 Hashes mit gleichen Keys, je 5 Stück, aber immer unterschiedlichen Values. Somit würd ich mir nur Komplizitätn schaffen, wenn ich Arrays benutzen würde...

        So wie du es beschriebst klingt es sowieso nicht sinnvoll, denn auch ein HASH kann nicht mehrmals den gleichne Schlüssel haben.

        Mir scheint eher das du dir so wie du es vor hast unnötige komplizitäten schaffst. Da du nur sehr umständlich auf deine Werte zugreifen kannst. Aber ohne genauere Kenntnisse deiner Struktur läßt sich dazu nichts genaues sagen.

        Struppi.

        1. Ich meinte, dass jeder Hash die gleichen Keys hat, also

          %A = {  a  =>   'a'
                  b  =>   'B'   }

          %B = {  a  =>   'C'
                  b  =>   'd'   }

          %C = {  a  =>   'e'
                  b  =>   'f'   }

          usw...

          1. Hallo Allack

            Ich meinte, dass jeder Hash die gleichen Keys hat, also

            %A = {  a  =>   'a'
                    b  =>   'B'   }

            %B = {  a  =>   'C'
                    b  =>   'd'   }

            %C = {  a  =>   'e'
                    b  =>   'f'   }

            usw...

            Und was spricht hier gegen ein Array?

            @A = (
            {  a  =>   'a'
            b  =>   'B'   },
            {  a  =>   'C'
            b  =>   'd'   },
            {  a  =>   'e'
            b  =>   'f'   },

            ....

            );

            Struppi.