Perl Packete Parameter



  • Hi!

    Ich muß in Perl etwas Programmieren und hab in Perl so gut wie keine Erfahrung.
    Ich habe mir als Klassenersatz Packete angelegt und bin etwas verwirrt:

    Rufe ich eine sub innerhalb des Packetes auf erhalte ich meine Parameter ab $[0]. Rufe ich aber die sub über ein Objekt (wenn man das so nennen darf) auf steht in $[0] vermutlich sowas wie this.

    package test;
    @EXPORT = qw(new,test,test2);
    sub new
    {
      my $self = {};
    $self->{"hallo"} = "";
      bless $self;
      return $self;
    
    }
    
    sub test
    {
        test2("Hallo Welt");
    }
    
    sub test2
    {
        print "0 : $_[0]\n";
        print "1 : $_[1]\n";
    }
    
    #!/usr/bin/perl
    
    use test;
    
    my $t = test::new;
    
    $t->test();
    $t->test2("GZGZ");
    

    Ausgabe:

    0 : Hallo Welt
    1 :
    0 : test=HASH(0x804b248)
    1 : GZGZ
    

    Da es ja nun in Perl imho sowas wie private etc. nicht gibt kann eine Methode ja von "aussen" als auch von "innen" aufgerufen werden.
    Wie handlet man da die o.g. Tatsache ? Die Parameter die man erwartet stehen ja also wo anderst.

    Gibt es eine bessere / sinvollere Möglichkeit die Parameter zu übergeben ?
    z.B. benannt ?

    sub test($string)
    {
    print $string;
    }

    Mir fehlen die Stichworte um bei Google was zu finden und das alte Perl Buch geht nicht mal auf packages ein.

    thx



  • Ich versteh zwar dein Problem nicht genau, versuche aber trotzdem mal zu helfen...
    $0 ist das erste Argument der Funktion
    $1 das zweite
    ...

    $_ ist die Variable die zuletzt verwendet wurde (salopp ausgedrückt)
    @_ ist das gleiche für die Liste!

    Also versuch mal in deinem Programm vielleicht das $_ durch @_ zu ersetzten.
    mit

    foreach(@_) { print "$_\n"; }
    

    kannst du alle Argumente zeilenweise ausgeben.

    PS: Bei Perl gibts sehr wohl ein private: siehe my

    -elvis

    [edit]Semikolon vergessen[/edit]



  • Ich habe es nun mal geändert:

    package test;
    @EXPORT = qw(new,test,test2);
    sub new
    {
      my $self = {};
    $self->{"hallo"} = "";
      bless $self;
      return $self;
    
    }
    
    sub test
    {
        foreach(@_) { print "$_\n"; }
        test2("Hallo Welt");
    }
    
    sub test2
    {
    print "\n";
    my $i = 0;
        foreach(@_)
        {
            print "$i : $_\n";
            $i++;  }
    
    }
    
    #!/usr/bin/perl
    
    use test;
    
    my $t = test::new;
    
    $t->test();
    $t->test2("GZGZ");
    
    Ausgabe:
    
    0 : Hallo Welt
    
    0 : test=HASH(0x804b248)
    1 : GZGZ
    

    Das my mag fuer Variablen gelten, aber wie schuetze ich eine sub davor von "aussen" aufgerufen zu werden ?

    bzw. wie kann ich prüfen ob @_[0] this entspricht ?!
    Wenn die Mehtode die intern verwendet wird von aussen aufgerufen wird steht totales Chaos bevor weil die Parameter verschoben sind.



  • elve schrieb:

    $0 ist das erste Argument der Funktion

    Jup thx das ist richtig.

    Ruft man aber $foo->bar() auf ist der erste Parameter eine Referenz auf sich selbst (vermutlich).

    Ruft man aber innherlab vom Packet foo auf ist der erste Parameter nicht this.

    Hmmmm...

    Das bringt mich auf die Idee mal zu versuchen self->bar() aufzurufen. mom

    Nö das klappt auch nich :o(

    Can't locate object method "test2" via package "self" (perhaps you forgot to load "self"?) at test.pm line 13.
    

    Ich mag das "OOP" in Perl nich. Irgendwie gebastel. Ich denke aber das es in wirklichkeit gut ist ich es nur nicht verstehe.



  • Das OOP in Perl ist nur aufgesetzt du hast keinerlei Schutz, dass jdm. von außen
    diese Subs nicht trotzdem direkt aufruft.
    Ich habe zwar lange nichts mehr mit Perl gemacht, aber ich meine ich habe in den
    Subs einfach mit dem 1.Parameter gearbeitet, sprich über diesen die Werte manipuliert,
    so als ob du immer this->foo = 12; this->bar = 1.3; usw. schreiben würdest.

    Aber ist schon über nen 3/4 Jahr her seit ich das letzte mal wirklich mit Perl
    programmiert habe, kann dir daher das nicht mehr genau sagen, vor allem habe ich
    OOP nie groß verwendet, höchstens wegen der Syntax beim zugriff auf die Subs, weil
    es mir besser gefiel 🤡

    Edit:

    Du könntest mal auf www.perl-community.de vorbeischauen, dort findest du auf jeden
    Fall hilfe, so wie es aussieht treibt sich hier gerade kein Perl spezialist rum.



  • Die Idee is cool und hilft genau beim Problem weiter.
    (mit dem $_[1] - die per-community.de natürlich auch 🤡
    thx


Anmelden zum Antworten