Joachim: Wie kann man zwei Variablen von einem Unterprogramm übernehmen??

Hi

Wie kann man zwei Variablen von einem Unterprogramm übernehmen??

Das funktioniert nicht!

sub Datenaufbereitung
{
   local @formularfelder;
   local ($name, $daten, $input);

$input = $_[0];
   @formularfelder = split(/&/, $input);

foreach $feld (@formularfelder)
   {
     ($name, $daten) = split(/=/, $feld);
     $daten =~ s/+/ /go;
     $daten =~ s/%(..)/pack("C", hex($1))/eg;
     @d[$i] = $daten;
     @c[$i] = $name;
     $i = $i + 1;
   }

return (@d,@c);
}

($aufdaten,$b)=&Datenaufbereitung($daten); # 2 Variablen!

Danke

  1. Hi,

    foreach $feld (@formularfelder)
       {
         ($name, $daten) = split(/=/, $feld);
         $daten =~ s/+/ /go;
         $daten =~ s/%(..)/pack("C", hex($1))/eg;

    @d[$i] = $daten;
         @c[$i] = $name;
         $i = $i + 1;

    Wieso machst du nicht einfach "push(@d, $daten)". Damit sparst du dir die Laufvariable.

    return (@d,@c);

    »»  }

    ($aufdaten,$b)=&Datenaufbereitung($daten); # 2 Variablen!

    Wenn ich keinen Denkfehler mache, gibst du aus der Funktion 2 Arrays zurück, schreibst diese aber in
    Skalare. D.h. in $aufdaten steht das erste Element von @d und in $b das zweite Element von @d. Ich nehme
    an, daß du @d im Unterprogramm in ein Array @aufdaten im Hauptprogramm speichern willst. Entsprechend
    @c im Unterprogramm nach @b im Hauptprogramm. Das geht so leider nicht, da @aufdaten sämtliche
    Array-Elemente "aufsaugt", die du mit return zurückgibst. In @aufdaten würden also sowohl die Elemente von
    @d, als auch die Elemente von @c stehen. Direkt hintereinander. @b wäre leer.

    Die Methode, die du zur Rückgabe der beiden Arrays verwenden willst, funktioniert so also leider nicht.
    Aber eigentlich mußt du auch nicht die gesamten Arrays zurückgeben. Es reicht, wenn du Referenzen auf
    beide Arrays zurückgibst. Anders als in anderen Programmiersprachen, bleiben die lokal angelegten Arrays
    nämlich auch nach Beenden der Subroutine erhalten, solange eine Referenz existiert. Du kannst also im
    Hauptprogramm "normal" darauf zugreifen und z.B. umkopieren.

    Ich hoffe dir soweit geholfen zu haben. (und vor allem die gewollte Funktionsweise verstanden zu haben :-))

    Gruß,
    Slyh

  2. Hallo,

    Wie kann man zwei Variablen von einem Unterprogramm übernehmen??

    Das funktioniert nicht!

    sub Datenaufbereitung

    »»  {

    local @formularfelder;
       local ($name, $daten, $input);

    $input = $_[0];
       @formularfelder = split(/&/, $input);

    foreach $feld (@formularfelder)
       {
         ($name, $daten) = split(/=/, $feld);
         $daten =~ s/+/ /go;
         $daten =~ s/%(..)/pack("C", hex($1))/eg;
         @d[$i] = $daten;
         @c[$i] = $name;
         $i = $i + 1;
       }

    return (@d,@c);

    »»  }

    ($aufdaten,$b)=&Datenaufbereitung($daten); # 2 Variablen!

    Danke

    Grundsätzlich können Funktionen in Perl Listen von Werten zurückliefern:

    sub wasauchimmer
    {
    return (1,2,3);
    }

    ($a,$b,$c) = &wasauchimmer;
    print "$a,$b,$c";

    liefert das erwartete Ergebnis. Die Ausgabe ist "1,2,3".
    Wunderbar, oder?

    Es geht auch so:

    sub wasauchimmer
    {
    my(@array);
    $array[0] = 1;
    $array[1] = 2;
    $array[2] = 3;
    return @array;
    }

    bei der Rückgabe von zwei Arrays funktioniert das gantze nicht mehr, da beide Listen quasi zu einem verschmolzen werden, da Perl nur _eine_ Liste zurückgibt.

    Allerdings willst Du ja auch nru, daß die aufrufende Funktion oder das Hauptprogramm eine Zuordnung zwischen den Namen und den Daten hat. Dafür kennt Perl auch die Lösung. Das ganze nennt sich Hash.

    sub Datenaufbereitung
    {

    hier habe ich mal zusammengefaßt ;-)

    my (@formularfelder) = split(/&/, $_[0]);

    das hier ist neu

    my(%params);

    hier habe ich nur das wesentliche geändert,

    Puristen mögen mir verzeihen

    foreach $feld (@formularfelder)
       {
       my($name, $daten) = split(/=/, $feld);
       $daten =~ s/+/ /go;
       $daten =~ s/%(..)/pack("C", hex($1))/eg;
       $params{$name} = $daten;
       }
    return(%params);
    }

    %formulardaten = &Datenaufbereitung($daten);

    So. Zugreifen kannst Du dann auf die Werte mit (VORNAME soll hier als einer der Namen genommen werden, die in den forumlarfeldern vorgekommen sind.

    print $forumlardaten{VORNAME};

    Ich hoffe, das ist jetzt auch geklärt.

    Und nun zum letzten. ICh denke, das was dieser Code macht, ist Formulardaten aus einem HTML-Formular für die weitere Bearbeitung aufzubereiten.
    Aber dafür gibt es ein weltweit unzählige Male eingesetztes Modul zu Perl: CGI.pm
    Dasa erledigt das ganze für dich und bietet noch unheimlich viel nützliches.

    Also:
    perldoc CGI
    und staunen. Das hat alles schon jemand für Dich ausprogrammiert, ist normalerweise schon auf Deiner Festplatte und wartet geduldi, daß Du es benutzt.

    Schönes Wochenende noch
      Klaus