Axeman: Referenzen -- wozu ?

Hi zusammen,

ich bin grad am durchlesen, wie referenzen funktionieren.
Aber ich verstehe noch nicht, wozu Referenzen gut sind ?

Wenn ich mache:
$var = 5;
$ref_var = $var;

Was bringt mir denn jetzt dieses Referenz ? Könnt ihr mir mal bespiele sagen, wann ich eine Referenz brauchen könnte?

cu
Axeman

  1. Hi,

    nunja... das ist ganz einfach... stell dir mal eine Variable vor die sehr groß ist, oder gar einen Hash... wenn du damit einen subroutine aufrufst wird bei einer normalen variablenübergabe ja alles übergeben... sprich der Inhalt der Variable... ist es aber referenziert und du übergibst die Referenz so wird nur eine Art Zeiger auf die Variable übergeben, nicht aber deren Inhalt... somit sparst du dir a) Zeit bzw. bekommst mehr Performance da der Speicher nicht mit dem übergeben der Variablen beschäftigt ist (und bei einem großen Hash kann das schnell in die 100 KB gehen...) und zudem kannst du eine Referenz schöner manipulieren... übergibst du eine Referenz an eine subroutine so brauchst du die referenz nicht zurückgeben um den Wert in geänderter Form zu bekommen... es wird bei einer Referenz alles quasi zentral verwaltet und so tatsächlich in 'echtzeit' verändert... normale Variablen muss man ja mit return zurückgeben, sonst gibts kein Ergebniss... Referenzen sich daher besonders bei größeren Projekten sehr nützlich und wichtig für die Geschwindigkeit des Systems.

    CU Quitschi

  2. Hi Axeman,

    mal auf Kommandozeilenebene aufrufen:
    perldoc perlref

    • durchlesen.

    Grüße
       K@rl

  3. Hi zusammen,

    ich bin grad am durchlesen, wie referenzen funktionieren.
    Aber ich verstehe noch nicht, wozu Referenzen gut sind ?

    Wenn ich mache:
    $var = 5;
    $ref_var = $var;

    Was bringt mir denn jetzt dieses Referenz ? Könnt ihr mir mal bespiele sagen, wann ich eine Referenz brauchen könnte?

    cu
    Axeman

    mit Referenzen kannst du zum Beispiel Variablennamen (für Variablen, Arrays etc) dynamisch erstellen.
    Wenn du zB. eine Konfigurationsdatei mit folgendem Format hast:

    [datensatz1]
    wert1=1
    wert2=2
    wert3=3
    [datensatz2]
    wert1=1
    wert2=2
    wert3=3

    kannst du das einlesen mit

    ...
    while (<DATENSATZDATEI>) {
      chomp;
      if (/[(.*)]/) {                # hier werden die Teile zwischen den eckigen Klammern gefunden
       $hashname=$1;                 # und in $hashname gespeichert
       next;
      } else {
       ($key,$value) = split /=/;
       $$hashname{$key} = $value;    # hier werden die Schlüssel-Wert-Paare in dem hash $hashname (also
      }                              # %datensatz1, %datensatz2 ..) gespeichert
    }
    ...

    du kannst auch ganze subroutinen on-the-fly erstellen und aufrufen, ohne dass sie im sourcecode erscheinen und vieles mehr.

    Referenzen sind schon eine tolle Sache

    Ciao
    Micha

    1. [datensatz1]
      wert1=1
      wert2=2
      wert3=3
      [datensatz2]
      wert1=1
      wert2=2
      wert3=3

      kannst du das einlesen mit

      ...
      while (<DATENSATZDATEI>) {
        chomp;
        if (/[(.*)]/) {                # hier werden die Teile zwischen den eckigen Klammern gefunden
         $hashname=$1;                 # und in $hashname gespeichert
         next;
        } else {
         ($key,$value) = split /=/;
         $$hashname{$key} = $value;    # hier werden die Schlüssel-Wert-Paare in dem hash $hashname (also
        }                              # %datensatz1, %datensatz2 ..) gespeichert
      }
      ...

      Hi,

      was hat das denn mit Referenzen zu tun ? Du erstellst doch nur mit einer Schleife neue Variablen, aber das sind doch keine Referenzen, oder ?

      cu
      Axeman

      1. ein kleiner Fehler ausgemerzt (die eckigen Klammern müssen escaped werden)
        hatte aber nichts mit dem Thema zu tun :)

        ...
        while (<DATENSATZDATEI>) {
          chomp;
          if (/[(.*)]/) {
           $hashname=$1;                  # 1.
          } else {
           ($key,$value) = split /=/;
           $hashname->{$key} = $value;    # 2.
          }
        }
        ...

        zu 1. $hashname ist tatsächlich nur eine Variable. Sie dient aber
        in 2. als symbolische Referenz für den Namen des Hashes, in dem die Schl.-Wert-Paare
              gespeichert werden sollen

        ciao
        Micha

  4. Hallo,

    ich bin grad am durchlesen, wie referenzen funktionieren.
    Aber ich verstehe noch nicht, wozu Referenzen gut sind?

    Referenzen sind gut, um abstrakte Datentypen darzustellen.
    Beispielsweise waeren die Pascal-Records oder die C-Structs ein gutes
    Beispiel dafuer, wozu man in Perl Referenzen braucht.

    Wenn ich mache:
    $var = 5;
    $ref_var = $var;

    Was bringt mir denn jetzt dieses Referenz?

    Tja nun, ein denkbar bloedes Beispiel ;-) Das eignet sich wirklich nur
    zur Syntax-Erklaerung.

    Könnt ihr mir mal bespiele sagen, wann ich eine Referenz brauchen
    könnte?

    Sicher. Beispielsweise sind Objekte 'nur' Referenzen. Oder besser,
    nehmen wir mal einen Abstrakten Datentyp, den man in C so definieren
    wuerde (sorry, die Pascal-Syntax ist zu lang fuer mich her, an die
    kann ich mich nicht mehr so genau erinnern):

    typedef struct s_datatype {
      struct {
        char *username,*password;
        int uid;
      } user_infos;

    struct {
        char *vname,*nname,*street,*city,*country;
        long plz;
        int hausnummer;
      } personal_infos;

    } t_datatype;

    t_datatype variable = {
     {
      "ckruse",
      "passwort",
      100
     },
     {
      "Christian",
      "Kruse",
      "Ascheberger Strasse",
      "Luedinghausen",
      "Deuschland",
      59348,
      15
     }
    };

    In Perl wuerde man das so schreiben:

    $var = {
      user_infos => {
        username => "ckruse",
        password => "passwort",
        uid      => 100
      },
      personal_infos => {
        vname  => "Christian",
        nname  => "Kruse",
        street => "Ascheberger Str."
        city   => "Luedinghausen",
        country => "Deuschland",
        plz => 59348,
        hausnummer => 15
      }
    };

    Wie du sicher siehst, sind das ineinander verschachtelte
    Hash-Referenzen. Auf diese Weise laesst sich nahezu jeder beliebige
    abstrakte Datentyp nachbilden.

    Gruesse,
     CK

    1. Hi,

      erstmal thx füe deine Antwort.
      Aber verstehen tu ich das ganze noch nicht wirklich.

      Ich hab mir jetzt nochmal die Perldoc durchgelesen und da
      steht was mit anonymen Listen und so. Was sind denn die und vor allem
      wir kann das sein, dass ein Skalar ein Array ist ?!?
      Tut mir echt leid ich blick da nicht durch und ohne eure Hilfe,
      werd ich auch nur sehr schwer weiterkommen ...

      cu
      Axeman

      1. Hoi,

        Ich hab mir jetzt nochmal die Perldoc durchgelesen und da
        steht was mit anonymen Listen und so.

        Ja.

        Was sind denn die

        $var = [1, 2, 3, 4];

        In $var steckt jetzt eine Referenz auf eine anonyme Liste. Anonym
        deshalb, weil es keine Variable gibt, die wirklich den Inhalt
        enthaelt, auf den diese Referenz zeigt.

        und vor allem wir kann das sein, dass ein Skalar ein Array ist ?!?

        Wer hat das gesagt? Wo steht das?

        Gruesse,
         CK

        1. Hi

          $var = [1, 2, 3, 4];

          ok das hab ich auch gesehen und da stand auch dran, dass des eine anonyme Liste ist.
          Da werfen sich mir ein paar Fragen auf:
          1. Wie kann eine Liste ein Skalar sein ?
          2. Ist jetzt in $var[0] der Wert 1 drin ?
          3. Ich versteh denn Sinn bzw. funktionsweise einer solchen Liste nicht.

          Nochmal vielen vielen Dank für Hilfe.
          Ich weiss RTFM aber ich komme damit echt nicht weiter.

          cu
          Axeman

          1. Hoi,

            $var = [1, 2, 3, 4];

            ok das hab ich auch gesehen und da stand auch dran, dass des eine
            anonyme Liste ist.
            Da werfen sich mir ein paar Fragen auf:

            1. Wie kann eine Liste ein Skalar sein ?

            Dem ist ja auch nicht der Fall. $var ist eine *Referenz* auf die Liste,
            sie zeigt darauf, so nach dem Motto "Da, da hinten, da ist was, was
            dich interessieren koennte."

            1. Ist jetzt in $var[0] der Wert 1 drin ?

            Nein. In $$var[0] oder in $var->[0]. Du musst die Referenz erst
            dereferenzieren.

            1. Ich versteh denn Sinn bzw. funktionsweise einer solchen Liste
              nicht.

            Wie gesagt: du kannst mit derartigen Konstrukten abstrakte Datentypen
            nachbilden. Perl kann z. B. keine mehrdimensionalen Arrays, von Haus
            aus (das liegt an der Verwaltung als Liste). Dafuer benutzt man
            Referenzen, bzw. anonyme Listen:

            @array = ([1,2,3],[1,[2,3]],[1,3,4]);

            waere Beispielsweise ein mehrdimensionaler Array.

            Nochmal vielen vielen Dank für Hilfe.

            Gern.

            Ich weiss RTFM aber ich komme damit echt nicht weiter.

            Hier wird sicher keiner gefressen.

            Gruesse,
             CK

            1. HI

              $var = [1, 2, 3, 4];

              1. Wie kann eine Liste ein Skalar sein ?

              Dem ist ja auch nicht der Fall. $var ist eine *Referenz* auf die Liste,
              sie zeigt darauf, so nach dem Motto "Da, da hinten, da ist was, was
              dich interessieren koennte."

              Aber in dem Fall ist doch da hinten garnix.
              Es gibt ja kein:
              @x = (1,2,3,4);
              $var = /@x;

              Ich dachte in $var steht nur eine Adresse Z.b. 0x4451 drin, aber wo stehen in
              dem Fall die Werte 1,2,3,4?!?

              1. Ich versteh denn Sinn bzw. funktionsweise einer solchen Liste
                nicht.

              Wie gesagt: du kannst mit derartigen Konstrukten abstrakte Datentypen
              nachbilden. Perl kann z. B. keine mehrdimensionalen Arrays, von Haus
              aus (das liegt an der Verwaltung als Liste). Dafuer benutzt man
              Referenzen, bzw. anonyme Listen:

              @array = ([1,2,3],[1,[2,3]],[1,3,4]);

              waere Beispielsweise ein mehrdimensionaler Array.

              Hmm um das zu verstehen müsste ich die erste Fragte wissen, denn
              mehrdimensionale Arrays hab ich so gelesen.
              @a = (1,2,3);
              @b = (3,4,5);

              @allarray = (@a, @b);
              Und dann kann man das mit 2 foreachschleifen auslesen.
              Ist das in deinem Beispiel jetzt auch eine REferenz oder ?
              Und wieder mit anonymen Listen.

              Uiuiui der Nebel wird zwar klarer aber ist dennoch sehr stark :o)

              cu
              Axeman

              1. Hoi,

                $var = [1, 2, 3, 4];

                1. Wie kann eine Liste ein Skalar sein ?

                Dem ist ja auch nicht der Fall. $var ist eine *Referenz* auf
                die Liste, sie zeigt darauf, so nach dem Motto "Da, da hinten,
                da ist was, was dich interessieren koennte."

                Aber in dem Fall ist doch da hinten garnix.

                Klar ist da was.

                Es gibt ja kein:
                @x = (1,2,3,4);
                $var = /@x;

                Du meinst '$var = @x;'
                Deshalb ist es ja auch eine anonyme Liste. Sie zeigt nicht auf eine
                real existierende Variable, sondern auf eine Speicherstruktur.

                Ich dachte in $var steht nur eine Adresse Z.b. 0x4451 drin,

                Ja.

                aber wo stehen in dem Fall die Werte 1,2,3,4?!?

                Im Speicher. Variablen sind auch nichts anderes als 'implizite'
                Zeiger auf Strukturen, die in den Speicher gepresst wurden. Du merkst
                davon zwar nicht viel (deshalb ja auch 'implizite Zeiger'), aber es
                ist so; Referenzen sind (in Perl) explizite Zeiger auf derartige
                Strukturen. Du musst sie von Hand dereferenzieren.

                Hmm um das zu verstehen müsste ich die erste Fragte wissen, denn
                mehrdimensionale Arrays hab ich so gelesen.
                @a = (1,2,3);
                @b = (3,4,5);

                @allarray = (@a, @b);

                Das ist auch eine Liste von Referenzen auf Listen.

                Ist das in deinem Beispiel jetzt auch eine REferenz oder ?

                Ja.

                Und wieder mit anonymen Listen.

                Ja.

                Gruesse,
                 CK