Christian Tristl: PERL-> Call by Reference

Hallo zusammen,

ich hab da n kleines Problem mit dem Call by Reference:
ich möchte eine Hash_ref einer subroutine übergeben und diesen dann weiterverwenden.

mein hash;

$split1->{0}= "test1";
$split1->{1}= "test2";

für eval: Funktionsaufruf mit Parameter:

$funk = $comTyp . "($split1)"; ###<--- vermutetes Problem ????

eval "use $comTyp";
unless ($xyy = eval "$comTyp->$funk")

leider ist der Hash, der bei der Funktion $comTyp ankommt leer, oder ist der überhaupt richtig übertragen worden ?

freu mich über jeden Tipp !!
mfg

Christian Tristl

  1. ich hab da n kleines Problem mit dem Call by Reference:
    ich möchte eine Hash_ref einer subroutine übergeben und diesen dann weiterverwenden.

    eigentlich kein Problem.

    mein hash;

    $split1->{0}= "test1";
    $split1->{1}= "test2";

    für eval: Funktionsaufruf mit Parameter:

    $funk = $comTyp . "($split1)"; ###<--- vermutetes Problem ????

    eval "use $comTyp";

    Was steht den in $comTyp?
    Evtl. ist es sinnvoller require zu verwenden dann sparst du dir das eval.

    unless ($xyy = eval "$comTyp->$funk")

    Irgendwie versteh ich nicht, was dabei rauskommen soll.

    Du kannst ohne Problem mit require zur Laufzeit Module einbinden und du kannst auch in Variabeln Funktionsrefrenzen speichern und dies dann Aufrufen.

    sub test
    {
       print "test";
    }

    my $func = &test;

    $split1->{0}= "test1";
    $split1->{1}= "test2";

    Das ist übrigens schon eine Referenz.

    &$func($split1)

    Struppi.

    1. ich hab da n kleines Problem mit dem Call by Reference:
      ich möchte eine Hash_ref einer subroutine übergeben und diesen dann weiterverwenden.

      eigentlich kein Problem.

      mein hash;

      $split1->{0}= "test1";
      $split1->{1}= "test2";

      für eval: Funktionsaufruf mit Parameter:

      $funk = $comTyp . "($split1)"; ###<--- vermutetes Problem ????

      eval "use $comTyp";

      Was steht den in $comTyp?
      Evtl. ist es sinnvoller require zu verwenden dann sparst du dir das eval.

      unless ($xyy = eval "$comTyp->$funk")

      Irgendwie versteh ich nicht, was dabei rauskommen soll.

      die Bedingung ist das $funk z.B so lauten kann: para($split1)
                                                      ^^^^^
      nur der Funktionsname soll variable bleiben, so spar ich mir eine switch Anweisung.

      hab das Problem gelöst : !!!!!!!!
      in der Funktion an die die Parameter übergeben werden hab ich den hash  so abgeholt : $split1 = @_;
      richtig:      $split1 = $_;

      danke nochmal !

      Du kannst ohne Problem mit require zur Laufzeit Module einbinden und du kannst auch in Variabeln Funktionsrefrenzen speichern und dies dann Aufrufen.

      sub test
      {
         print "test";
      }

      my $func = &test;

      $split1->{0}= "test1";
      $split1->{1}= "test2";

      Das ist übrigens schon eine Referenz.

      &$func($split1)

      Struppi.

      1. Irgendwie versteh ich nicht, was dabei rauskommen soll.

        die Bedingung ist das $funk z.B so lauten kann: para($split1)
                                                        ^^^^^
        nur der Funktionsname soll variable bleiben, so spar ich mir eine switch Anweisung.

        Nein, du benützt lediglich ein überflüssiges eval.

        my $var = "para";

        &$var('bla');

        sub para
        {
         print $_[0];

        }

        hab das Problem gelöst : !!!!!!!!
        in der Funktion an die die Parameter übergeben werden hab ich den hash  so abgeholt : $split1 = @_;
        richtig:      $split1 = $_;

        Nein, entweder:

        $split1 = $_[0];

        oder

        $split1 = shift;

        Ist aber auch klar, du übergibst eine Referenz und nicht den ganzen Hash.

        Alles in allem erscheint mir das sehr gefährlich was du da machst, da es nicht so aussieht als ob du weißt was du tust.

        Struppi.

        1. Hallo Struppi,

          {
            no strict 'refs';

          my $var = "para";

          &$var('bla');

          }

          Grüße,
           CK

          --
          Sich erinnern bedeutet, aus einer Erfahrung nicht ausreichend gelernt zu haben.