$xNeTworKx: Werte ausserhalb d. Subroutine ändern ?

Hallo,
Ich hab da ein kleines Problem, das ich nicht verstehe, und zwar will ich Werte ausserhalb einer Subroutine ändern. Mit Referenzen an und für sich kein Problem.
Jetzt wollte ich aber versuchen, ohne Referenzen zu arbeiten, und die Werte mit return($wert1,$wert2...) ausserhalb ändern. Die Werte werden aber nicht geändert. Was ist daran falsch ?

So funktioniert es :

checkposting($thema,$name,$usergrafik,$breite,$hoehe,$email,$hpadresse,$icq,$error);
.
.
sub checkposting  {
my($checkthema,$checkname,$checkusergrafik,$checkbreite,$checkhoehe,$checkemail,$checkhpadresse,$checkicq,$error) = @_;

if ($$checkname.....
.
.
}

So aber nicht ?
checkposting($thema,$name,$usergrafik,$breite,$hoehe,$email,$hpadresse,$icq,$error);
.
.
.
sub checkposting  {
my($checkthema,$checkname,$checkusergrafik,$checkbreite,$checkhoehe,$checkemail,$checkhpadresse,$checkicq,$error) = @_;

if ($checkthema....
.
.

return($checkthema,$checkname,$checkusergrafik,$checkbreite,$checkhoehe,$checkemail,$checkhpadresse,$checkicq,$error);
}

$xNeTworKx.

  1. Hallo,

    checkposting($thema,$name,$usergrafik,$breite,$hoehe,$email,$hpadresse,$icq,$error);
    sub checkposting  {
    my($checkthema,$checkname,$checkusergrafik,$checkbreite,$checkhoehe,$checkemail,$checkhpadresse,$checkicq,$error) = @_;

    if ($checkthema....

    return($checkthema,$checkname,$checkusergrafik,$checkbreite,$checkhoehe,$checkemail,$checkhpadresse,$checkicq,$error);

    }

    Du mußt die Werte, die Du mit return zurückgibst, auch abholen.

    z.B.:
    ($checkthema,$checkname,$checkusergrafik,$checkbreite,$checkhoehe,$checkemail,$checkhpadresse,$checkicq,$error)=
    checkposting
    ($thema,$name,$usergrafik,$breite,$hoehe,$email,$hpadresse,$icq,$error);

    Allerdings denke ich, daß in diesem Falle Referenzen besser sind.

    Grüße
      Klaus

    1. Hallo,

      Du mußt die Werte, die Du mit return zurückgibst, auch abholen.

      z.B.:
      ($checkthema,$checkname,$checkusergrafik,$checkbreite,$checkhoehe,$checkemail,$checkhpadresse,$checkicq,$error)=
      checkposting

      Achso verstehe. Ich dachte, die Werte übernehmen die Plätze der übergebenen Variablen, danke.

      $xNeTworKx.

      1. use Mosche;

        Achso verstehe. Ich dachte, die Werte übernehmen die Plätze der übergebenen Variablen, danke.

        Das ist nur der Fall, wenn du deine Daten direkt in @_ änderst, dass ist aber ein Sonderfall und trägt meines Erachtens nicht gerade zur Leserlichkeit deines Quellcodes bei. => IMHO Tabu, nimm Referenzen.

        Noch was zu deinem Coding-Stil:
        Wenn du eine grosse Menge an zusammenhängenden Daten hast
        (ich denke, es geht um dein Forum, dann also zum Beispiel Name, Vorname, Email, ...) verwende besser einen Hash oder (wenn man es wirklich genau machen würde) baue ein entsprechendes Objekt. Dadurch wird dein Quellcode übersichtlicher.

        use Tschoe qw(Matti);

        1. Hi,

          Achso verstehe. Ich dachte, die Werte übernehmen die Plätze der übergebenen Variablen, danke.

          Das ist nur der Fall, wenn du deine Daten direkt in @_ änderst, dass ist aber ein Sonderfall und trägt meines Erachtens nicht gerade zur Leserlichkeit deines Quellcodes bei. => IMHO Tabu, nimm Referenzen.

          Ja, aber ich brauche das später, weil man ja zwischen absenden und speichern noch eine Zwischenabfrage hat, bei der man im Notfall nochmal zurückklicken kann. Dadurch, daß die Daten nicht immer hin und her konvertiert werden sollen,  brauch ich eine Möglichkeit, die alten Daten inzwischen auf "Reserve" zu halten.

          Noch was zu deinem Coding-Stil:
          Wenn du eine grosse Menge an zusammenhängenden Daten hast
          (ich denke, es geht um dein Forum, dann also zum Beispiel Name, Vorname, Email, ...) verwende besser einen Hash oder (wenn man es wirklich genau machen würde) baue ein entsprechendes Objekt. Dadurch wird dein Quellcode übersichtlicher.

          Hmmm ich wüsste nicht, was mir ein Hash bringen würde, bzw wo ich diesen verwenden müsste. Desweiteren hab ich bis jetzt nichts OO programmiert, weil ich noch immer nicht genau verstehe, wie OO eigentlich genau funktioniert.

          $xNeTworKx.

          1. Hi nochmal,
            hab schnell nachgelesen was objektorientiert genau ist. Ich kann mir jetzt darunter ein wenig vorstellen, aber ich glaube nicht, dass ich es jetzt schaffe, etwas so komplexes wie ein Forum oo zu programmieren, aber der Ansatz gefällt mir ganz gut. Bei Gelegenheit werd ich mich mal damit mehr beschäftigen, danke.

            $xNeTworKx.

          2. use Mosche;

            Wenn du eine grosse Menge an zusammenhängenden Daten hast
            (ich denke, es geht um dein Forum, dann also zum Beispiel Name, Vorname, Email, ...) verwende besser einen Hash oder (wenn man es wirklich genau machen würde) baue ein entsprechendes Objekt. Dadurch wird dein Quellcode übersichtlicher.

            Hmmm ich wüsste nicht, was mir ein Hash bringen würde, bzw wo ich diesen verwenden müsste. Desweiteren hab ich bis jetzt nichts OO programmiert, weil ich noch immer nicht genau verstehe, wie OO eigentlich genau funktioniert.

            Bei meiner Aussage geht es prinzipiell um Folgendes:
            Du hast prozedural programmiert, was grundsätzlich nichts schlechtes ist. Ein (eher theoretisches) Problem deines Codes ist aber, dass du Daten, die zusammengehören getrennt behandelst, zB hast du verschiedene Variablen für Name, Vorname, EmailAdresse, .... Ich an deiner Stelle würde für den gesamten Datenkomplex 'Poster' einen Hash nehmen, um der Zusammengehörigkeit der Daten Ausdruch zu verleihen.

            Also statt
            new_posting($name, $vorname, $email)
            einfach

            my %poster = (name => $name, vorname => $vorname, $email => $email);
            new_posting(%poster);

            Das erhöht letztendlich die Übersichtlichkeit deines Codes.

            Das mit Objektorientierung geht dann noch mehrere Schritte weiter. Wie du vielleicht gelesen hast, betrachtet man bei OOP verschiedene Datenkomplexe als Objekte, zB dein Poster. OOP ist bei Perl nicht sehr ausgeprägt und macht eigentlich erst wirklich Sinn, wenn du gleichzeitig mehrere gleiche Objekte verwaltest, was bei einem Forum so direkt nicht vorkommt.

            use Tschoe qw(Matti);

            $xNeTworKx.