Dietrich: Rekrsive Funktion in Perl

Hallo,
wie muss ich im folgenden Beispiel vorgehen, dass beim Folgeaufruf der Routine addtext im Argument @text der Wert steht, der im Aufruf zuvor zurückgegeben wurde.
Im Augenblick wird addtext immer mit "*" aufgerufen, obwohl im Ergebnis @text des Aufruf "*;irgendwas" steht.

my @text = ("*");
       foreach (@zeilen)
         {
          @text = addtext ($_, @text);
         }

  1. Hallo,
    wie muss ich im folgenden Beispiel vorgehen, dass beim Folgeaufruf der Routine addtext im Argument @text der Wert steht, der im Aufruf zuvor zurückgegeben wurde.
    Im Augenblick wird addtext immer mit "*" aufgerufen, obwohl im Ergebnis @text des Aufruf "*;irgendwas" steht.

    my @text = ("*");
           foreach (@zeilen)
             {
              @text = addtext ($_, @text);
             }

    Dazu müsste man wohl wissen, was in der Funktion "addtext" drin steht. Kennst du auch die Funktion "push"? Vermutlich willst du nur sowas in der Art haben:

    push @text, @zeilen;

    Damit wird einfach das Array @zeilen an @text angehängt.

    1. my @text = ("*");
             foreach (@zeilen)
               {
                @text = addtext ($_, @text);
               }

      Dazu müsste man wohl wissen, was in der Funktion "addtext" drin steht. Kennst du auch die Funktion "push"? Vermutlich willst du nur sowas in der Art haben:

      Hier die Routine:
      (Ziel: Zeilen weiter zerlegen, wenn mind. 45 Stellen)

      sub addtext
         {
          my $zeile      = shift;
          my @textneu    = shift;
          if (length($zeile) < 45)
            {
              push(@textneu,$zeile);
            }
          else
            {
      #    noch nicht realisiert
            }
          return(@textneu);
         }      # Ende sub addtext

      1. Hier die Routine:
        (Ziel: Zeilen weiter zerlegen, wenn mind. 45 Stellen)

        sub addtext
           {
            my $zeile      = shift;
            my @textneu    = shift;

        Hier ist der Fehler. shift gibt immer den nächsten Skalar zurück, was bei dir eben immer das "*" ist. Folgende Möglichkeiten:

        • my @textneu = @_;
          $zeile ist aus dem Parameter-Array durch das vorhergehende shift entfernt worden, so das nur noch das benötigte @text drin steht.

        • oder du arbeitest mit Referenzen. also
          my @textneu = @{shift()};
           und der Aufruf erfolgt dann über
          @text = addtext ($_, @text);
          Diese Variante ist dann brauchbar, wenn du evtl. mal nach dem Array noch einen dritten Parameter übergeben willst.

        if (length($zeile) < 45)
              {
                push(@textneu,$zeile);
              }
            else
              {
        #    noch nicht realisiert
              }
            return(@textneu);
           }      # Ende sub addtext

        Wünsche frohes Schaffen.

        1. Hallo,

          »»Wünsche frohes Schaffen.

          Danke für die Hilfe, jetzt kann ich wieder froh schaffen.
          Gruß
          woako