Stefan Kammler: Möglichkeiten bei der Namensgebung von Arrays

Ich erstelle in einer Schleife bei jedem Durchgang einen neunen Array, diese müssen sich namentlich unterscheiden (geht wohl nur mit einer Variable), welche Möglichkeiten habe ich da?
Ein Beispiel, dass selbstverständlich nicht funktioninert: @Array$Index

  1. Hallo Stefan,

    Ich erstelle in einer Schleife bei jedem Durchgang einen neunen Array, diese müssen sich namentlich unterscheiden (geht wohl nur mit einer Variable), welche Möglichkeiten habe ich da?
    Ein Beispiel, dass selbstverständlich nicht funktioninert: @Array$Index

    Ich würde an deiner Stelle die Arrays nicht explizit benennen sondern nur eine Referenz auf sie in einem globalen Array speichern.

    my @global_array = ();
    {
     my @local_array = (a,b,c);
     push (@global_array, @local_array);
    }
    {
     my @local_array = (d,e,f);
     push (@global_array, @local_array);
    }
    print  @{$global_array[0]}; # abc
    print  @{$global_array[1]}; # def

    Grüße Peter

    1. Ich hätte da mal folgenden Quuelltext, der leider keine Ausgabe bewirkt:

      $NewsAnzahl = @News;

      $w = 6;
      $x = 0;

      @Artikel = ();

      while($x <= $NewsAnzahl-1) {

      if($x == $w) {
      push (@Artikel, @Artikelteil);
      @Artikelteil = ();
      $w += 6;
      }
      push(@Artikelteil, $News[$x]);
      $x++;
      }

      print "@{$Artikel[0]}";

      Wenn ich in der if-Schleife den @Artikelteil ausgeben lass, zeigt er den (fast) korrekten Inhalt des Arrays an.

      1. Hallo Stefan,

        $NewsAnzahl = @News;
        $w = 6;
        $x = 0;
        @Artikel = ();
        while($x <= $NewsAnzahl-1) {
          if($x == $w) {
            push (@Artikel, @Artikelteil);
            @Artikelteil = ();
            $w += 6;
          }
          push(@Artikelteil, $News[$x]);
          $x++;
        }
        print "@{$Artikel[0]}";

        Ich vestehe den Sinn des Scriptes nicht ganz. Aber dein Problem ist vermutlich der Befehl:

        push (@Artikel, @Artikelteil);

        bedeutet: schreibe alle Elemente des Arrays @Artikelteil nacheinander in das Array @Artikel. Was du vermutlich willst ist aber

        push (@Artikel, @Artikelteil);

        Dies schreibt eine Referenz auf das Array @Artikelteil in @Artikel.
        PERL kennt übrings auch for Schleifen ;-)

        Grüße Peter

        1. Das Skript sollje sechs Elemente aus @News zusammenfassen und in einem anderen Array speichern. Wenn ich das Skript so wie oben beschrieben abändere, gibt er mir auch nur einen Wert aus und nicht sechs.

          1. Das Skript sollje sechs Elemente aus @News zusammenfassen und in einem anderen Array speichern. Wenn ich das Skript so wie oben beschrieben abändere, gibt er mir auch nur einen Wert aus und nicht sechs.

            Dein Problem ist das Array @Artikelteil. Das Array ist global, das heißt das du immer wieder in @Artikel eine Referenz auf das _selbe_ Array geschrieben hast. Leider ist es in deinem Script nicht möglich @Artikelteil lokal für ein Durchlauf mit 6 Elementen zu definieren.

            Es gibt sicherlich elegantere Lösungen (z.B. mit Slices) aber das hier ist mein spontanter 1-Minute-Hack Einfall für dein Problem gewesen:

            #! /usr/bin/perl -w

            my @News = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
            my $w = 6; # jeweils 6 Elemente in ein Array
            my @partial = ();
            while ($#News > 0) {
             my @mem = (); # neues leeres _lokales_ Array
             for ($j=0; $j<$w && $#News > 0; $j++) {
              push(@mem, shift @News); # entferne 1 Element aus @News und
                                                     # hänge es an @mem an.
             }
             push(@partial, @mem); # hänge Referenz auf @mem an @partial an
            }

            nur zur Kontrolle ;-)

            foreach my $ptr (@partial) {
             print join(':',@{$ptr}),"\n";
            }

            1:2:3:4:5:6

            7:8:9:10:11:12

            13:14

            Ich hoffe das hilft dir vorerst weiter.

            Grüße Peter