Schrift
[thread]6191[/thread]

Perl - Sub Routinen Parameter. (Seite 3)

Leser: 3


<< |< 1 2 3 4 >| >> 34 Einträge, 4 Seiten
Gast Gast
 2004-04-18 16:02
#81544 #81544
Nochmal zurück zu Deinem Test-Beispiel:

Wenn Du innerhalb einer Klasse eine Funktion aufrufen willst, dann kannst Du das tatsächlich ganz einfach über den Namen der Funktion tun, also:
that_sub(); #ohne Argument
that_sub($foo, $bar); # mit Argumenten

Wenn Dich der Rückgabewert der Funktion interessiert:
$self->{'WhatEver'} = that_sub(); #ohne Argument
$self->{'WhatEver'} = that_sub($foo, $bar); # mit Argumenten

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package test;
##########################
sub new {
##########################
my $class = shift;
my $self = {};

bless $self, $class;
return $self;
}

##########################
sub test {
##########################
my ($self) = shift;
my @arg = @_;

test2(@arg);
}

##########################
sub test2 {
##########################
my @messages = @_;
print "\n";
print "Alle Mitteilungen:\n";
print "$_\n" foreach @messages;
}
##########################
1; #Wichtig!!!
##########################


Der Aufruf aus dem Hauptprogramm würde wie folgt aussehen:

Code: (dl )
1
2
3
use Test;
my $obj = Test->new();
$obj->test('Hallo', 'World');
Knuddlbaer
 2004-04-18 17:47
#81545 #81545
User since
2004-04-13
32 Artikel
BenutzerIn
[default_avatar]
thx das hat ein paar wissenslücken gefüllt.


Das Problem bleibt aber weiterhin:

Wenn $obj->test aufgerufen wird klappt alles.
Ruft jemand $obj->test2 auf komme ich wieder zu dem Problem das ich die Parameter verschoben habe.


Rene brauchte mich aber auf die Idee immer $self abzufangen und von diesem self die Routinen aufzurufen.

Kein Perfekter Schutz, aber wenn $self falsch ist , ist die Warscheinlichkeit das der Interpreter Mosert hoch. Und falsch kann es eigentlich nur sein wenn ich innerhalb der Klasse einen falschen Aufruf mache.

In C++ hätte ich test2 einfach private gemacht und mir darüber keinen Kopf mehr zerbrochen.
Gast Gast
 2004-04-18 18:27
#81546 #81546
Da hast Du was in den falschen Hals gekriegt :-)
sub test2
ist in dem Beispiel keine Objektmethode sondern eine private Methode des Objekts - also nur für den internen Gebrauch innerhalb der Instanz bestimmt.

Normalerweise schreibt man dann auch nicht
sub test2
sondern
sub _test2

Diese private Methode ist von außen nicht zugänglich (die Verwendung führt zu dem von Dir beschriebenen Fehler) und so soll das dann ja auch sein.

Jede Schnittstellen-Methode (also eine Instanz-Methode die von außen zugänglich ist) muß natürlich mit
$self = shift;
beginnen, wie anders sollte die Hash-Referenz sonst rüberkommen?

Sorry - ich drücke mich wohl immer so kompliziert aus - also hak einfach nochmal nach wenn ich wieder mal unverständliches Zeug absondere. :)
Knuddlbaer
 2004-04-18 18:59
#81547 #81547
User since
2004-04-13
32 Artikel
BenutzerIn
[default_avatar]
Quote
sub _test2

Diese private Methode ist von außen nicht zugänglich (die Verwendung führt zu dem von Dir beschriebenen Fehler) und so soll das dann ja auch sein.


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package test;
##########################
sub new {
##########################
my $class = shift;
my $self = {};

bless $self, $class;
return $self;
}

##########################
sub test {
##########################
my ($self) = shift;
my @arg = @_;

_test2(@arg);
}

##########################
sub _test2 {
##########################
my @messages = @_;
print "\n";
print "Alle Mitteilungen:\n";
print "$_\n" foreach @messages;
}
##########################
1; #Wichtig!!!
##########################


Code: (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl


use test;

my $t = test->new;

$t->_test2("GZGZ");


Wird ohne Probleme ausgeführt ?!
Ich verstehe jetzt nicht wie mich der '_' davor schützen soll das diese sub von aussen aufgerufen wird :confused:


Code: (dl )
beginnen, wie anders sollte die Hash-Referenz sonst rüberkommen?


Naja, ich bin von C++ gewohnt das diese Referenz (this) immer vom Compiler übergeben wird und *immer* vorhanden ist. Egal ob der Aufruf von aussen kommt oder von innen.

Bei Perl muss man this-> immer angeben (ohne gibts knatsch) und in Perl kann man das mischen was mich in Probleme bringt.

Das erste ist durch den Post von rene , self immer zu verwenden (wie this bei PHP) gelöst, aber es schützt mich nicht davor das ein Anwender des Objektes >versehentlich< eine Routine verwendet die nur intern aufgerufen werden sollte und falsch angwendet hohen schaden erzeugen kann....

Aber ich glaube fast, davor gibts in Perl kein Schutz.
format_c
 2004-04-18 19:09
#81548 #81548
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Das _ schützt nicht davor die sub von außen aus aufzurufen.
SubRoutinen beginnend mit _ ind Modulen bedeutet lediglich dass es Internas des Moduls sind die auch evtl. vom Author geändert werden können ohne dies zu erwähnen.
Quote
...
Why the underscore? For the same reason as the _CENSUS field we once used: as a marker that means "for internal use only".
...

Zitat aus perldoc perltoot

Gruß Alex
Knuddlbaer
 2004-04-18 19:20
#81549 #81549
User since
2004-04-13
32 Artikel
BenutzerIn
[default_avatar]
thx ich nehme dann die richtlinie mal an und hoffe mal das keiner Unsinn mit treibt :o)


thx @ll
Gast Gast
 2004-04-18 19:39
#81550 #81550
@Knuddelbaer:
- PHP
kennt keinen Namensraum (das ist ja das fürchterliche an dem Teil)

- Underscore
unter Perl gibt es nur das Schild 'Bitte nicht betreten'
wer's dennoch tut; bitte schön - auf eigene Gefahr!

Du bist der Programmierer und Du gestaltest Deine Module (im aktuellen Fall gestaltest Du auch Dein Hauptprogramm)
Wer also Deine Module verwendet der hat sich auch an die Konvention der Schnittstellen zu halten (oder erleided Schiffbruch).
Knuddlbaer
 2004-04-18 21:01
#81551 #81551
User since
2004-04-13
32 Artikel
BenutzerIn
[default_avatar]
Tja kenne ich aus der Praxis anderst. Es gibt genug Programmierer die ihr Ziel "erfpuscchen" damit sie "schnell" zur Lösung kommen :o( DIe einen tun es aus unwissenheit (wie ich als Anfänger von Perl z.B. keine Ahnung was geht was nicht geht etc.) und viel schlimmer: Andere tun es bewusst.


Ich habe in der Vergangenheit Module für dritt Programmierer geschrieben und wollte den Erfahrungsschatz in Perl übernehmen. Nu hab ich nen Strich in meiner Rechnung :o/


Auf jeden fall vielen Dank für die Richtlinie, das hilft doch schon mal weiter eine übliche Dokumentation für "FINGER WECH!" zu haben.


thx\n\n

<!--EDIT|Knuddlbaer|1082307774-->
Crian
 2004-04-19 13:02
#81552 #81552
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Man kann in Perl Sachen (wie Methoden) noch tiefer verstecken als in C++, wenn man das möchte. Aber das ist nicht schön.

Wenn jemand unbedingt an die Interna von außen ran will, schreibt er sich zur Not eine Methode dafür. Da ist der Perl-Ansatz "für erwachsene Programmier" doch besser. "Hier diese Methode ist intern, wenn Du unbedingt meinst, sie von außen verwenden zu müssen, bitte, aber wunder Dich dann nicht, wenn Dein Programm mit der nächsten Version des Moduls nicht mehr läuft."

Ich hatte zu Beginn ähnliche Probleme, weil ich auch von C++ zu Perl kam. UInd manchmal vermisse ich immer noch virtuelle Methoden / Klassen etc.

Der Unterschied ist vielleicht auch, dass man in C++ vorkompilierte Module als DLL's zur Verfügung stellen kann, wo man Drittprogrammierern dann nur die Schnittstelle nennt, und sie damit leben müssen. Da sie in Perl eh an den Modulcode rankommen, könnten sie sich für ihren Fusch halt entsprechende Routinen schreiben...

Aber schlechte Programmierer werden es immer irgendwie schaffen, schlechte Programme zu schreiben ;)

Das glingt einem sogar manchmal selbst, auch wenn man sich bemüht, sauber und ordentlich zu programmieren. Wenn jemand bewusst Schnellschüsse mit System schreibt, wirst Du ihn nicht wirklich hindern können.\n\n

<!--EDIT|Crian|1082365610-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Knuddlbaer
 2004-04-19 14:03
#81553 #81553
User since
2004-04-13
32 Artikel
BenutzerIn
[default_avatar]
*seufz*

Jo das ist die Realität :o)

Ich habe in Perl noch ein ungutes Gefühl. Schon 2h verbrachte den Code an neue Kentnisse anzupassen und pfusch zu beseitigen :o)

Ich hab die letzten Tage aber schon viel gelernt und langsam fängt es an spass zu machen :o) (Auch wenn ich lieber in C++ programmiere, aber da wieder was machen muss. Sonst vergess ich da wieder alles :o( temlates templates polcy klassen etc... Das einmal total vergessen kann man mit C++ nich mehr viel anfangen...)
<< |< 1 2 3 4 >| >> 34 Einträge, 4 Seiten



View all threads created 2004-04-13 21:22.