Schrift
[thread]7033[/thread]

subname paketname;



<< >> 8 Einträge, 1 Seite
cs
 2005-06-04 13:12
#55318 #55318
User since
2005-05-19
26 Artikel
BenutzerIn
[default_avatar]
ich bin überrascht, dass der aufruf von
subname paketname;
dem von
paketname::subname;
entspricht.


package hallo;
sub ausgabe {
$tmp = shift;
print $tmp . " du\n";
}
package main;
hallo::ausgabe(); # " du" wird ausgegeben
ausgabe hallo; # "hallo du" wird ausgegeben


warum interpretiert die sub das erste argument als paketnamen? wo ist das beschrieben?
pq
 2005-06-04 13:28
#55319 #55319
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
perldoc perlobj, perltoot, perlmod
suche nach "indirect object syntax"
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
esskar
 2005-06-04 13:30
#55320 #55320
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=cs,04.06.2005, 11:12]ausgabe hallo;     # "hallo du" wird ausgegeben

warum interpretiert die sub das erste argument als paketnamen? wo ist das beschrieben?[/quote]
entsprciht quasi
Code: (dl )
hallo->ausgabe;
Strat
 2005-06-04 18:43
#55321 #55321
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
analog dazu ist es (fast) egal, ob man schreibt:
Code: (dl )
my $cgi = CGI->new;

oder:
Code: (dl )
my $cgi = new CGI;

wenngleich die zweite schreibweise "interessanter" ist, wenn es im aktuellen Namensraum zufaelligerweise die subroutinen new und CGI gibt ;-)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
cs
 2005-06-04 19:16
#55322 #55322
User since
2005-05-19
26 Artikel
BenutzerIn
[default_avatar]
in englisch verstehe ich nur das grobe und leider nicht nicht die feinheiten. wo gibt es eigentlich die komplette perl doku zum download in deutsch?


dieser infix-dereferzierungsoperator mach mir das leben schwer. was heißt eigentlich "infix" ?
$hashref -> {key} ; # hier dient er der dereferenzierung
paketname -> subname ; # hier dem subaufruf
$objektref -> methode ; # hier dem methodenaufruf
finde ich ziemlich verwirrend!


in folgenden 3 fällen wir eine ordinäre sub aufgerufen, wobei der
der paketname nur manchmal mitgegeben wird.

Paketname::subname ; # 1) paketname wird nicht mitgegeben
subname paketname ; # 2) paketname ist erstes argument
paketname -> subname # 3) paketname ist erstes argument


die syntax in 2) und 3) dient eigentlich dem methodenaufruf, der fehlermeldung im fehlerfalle nach. von daher vermute, dass diese benutzung von den designern gar nicht gewollt ist.

oder doch?


mir ist klar, das in der oop die methode den paketname für die klassenzugehörigkeit braucht und die objektrefrenz um überhaupt das objekt zu finden. von daher verstehe ich den sinn dieses mechanismus.

objektref -> methode(arg1,...) ;

durch diesen aufruf bekommt die methode die gesegnete referenz, also paketnamen inklusive, als erstes argument mitgeliefert.


methode (objektref,arg1,...) ;

bei diesem methodenaufruf holt sich die methode anscheinend den paketnamen aus der gesegneten referenz selbstänig heraus.


hier noch einmal im überblick das erste übergebene argument

Paketname::subname ; # keines
subname paketname ; # paketname
paketname -> subname # paketname
objektref -> methode # gesegnet referenz

finde ich nach wie vor verwirrend! wie kann ich es einfacher betrachten?
sri
 2005-06-04 19:39
#55323 #55323
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Strat,04.06.2005, 16:43]wenngleich die zweite schreibweise "interessanter" ist, wenn es im aktuellen Namensraum zufaelligerweise die subroutinen new und CGI gibt ;-)[/quote]
Und genau deshalb ist es absolut pfui (besonders wenn vererbung ins spiel kommt wirds haarig), "die indirect object syntax" ist eines der sichersten Merkmale an denen man einen Anfaenger erkennt... ;)\n\n

<!--EDIT|sri|1117899566-->
ptk
 2005-06-04 21:10
#55324 #55324
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Leider gibt es diese Probleme. Ich finde "indirect object syntax" optisch einfach schoener...
pKai
 2005-06-05 03:19
#55325 #55325
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
[quote=cs,04.June.2005, 17:16]wie kann ich es einfacher betrachten?[/quote]
Ich zitiere mal aus der Übersetzung Wiki:Perldoc.perlobj von betterworld:
Quote
1. Ein Objekt ist einfach eine Referenz, nur dass es weiß, welcher Klasse es angehört.

2. Eine Klasse ist einfach ein Paket, nur dass sie Methoden bietet, um mit Objektreferenzen umzugehen.

3. Eine Methode ist einfach eine Subroutine, die eine Objektreferenz (oder einen Paketnamen im Falle einer Klassenmethode) als erstes Argument erwartet.

Die für dich wesentlichen Teile sind in Deutsch vorhanden.
I sense a soul in search of answers.
<< >> 8 Einträge, 1 Seite



View all threads created 2005-06-04 13:12.