Schrift
[thread]13172[/thread]

Was bedeutet das "-" ?

Leser: 17


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
hlubenow
 2009-02-22 22:54
#119070 #119070
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich bin neu im Forum, hab' aber schon ein paar Sachen mit Python/Tkinter gemacht und auch ein kleines Tutorial dazu geschrieben (bitte JavaScript dort ausschalten, sonst Werbung):

http://www.angelfire.com/linux/tux25/python/tkinte...

in dem ich auch ein Beispiel aus Crian's schönem Perl/Tk-Tutorial

http://wiki.perl-community.de/bin/view/Wissensbasi...

nach Python übertragen hatte:

http://www.angelfire.com/linux/tux25/python/tkinte...

Mit Perls OOP kenne ich mich noch nicht so gut aus. Daher meine Frage: Warum sind da Bindestriche vor den Optionen ("-text") in Perl/Tk-Zeilen wie:
Code: (dl )
my $label = $main->Label(-text => 'Hello, world!');

Was bedeutet die Zeile aus OOP-Sicht ? "$main" scheint ein Objekt zu sein (oder eine Referenz auf ein Objekt ??), mit "->" wird eine Methode aufgerufen (oder ein neues Label-Objekt instantiiert ??), dieses "=>" gibt es bei Hashes, was bedeutet das, ist "-text" ein Hash-Key ?

Viele Grüße

P.S.: Sorry, daß ich bei der Thread-Überschrift vergessen hatte anzugeben, daß die Frage sich auf Perl/Tk bezieht. Kann's anscheinend nicht nachträglich verbessern ...
LanX-
 2009-02-22 23:53
#119071 #119071
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
das - hat hier mehr Dekorationswirkung in Perl, man kanns auch getrost weglassen.

man will damit hervorheben, dass es sich um optionale argumente handelt... außerdem wird es wahrscheinlich in Sonderfällen helfen wenn man in perl den hashkey sonst quoten müsste um fehlinterpretationen zu vermeiden.

Perl ist halt mehr DWIM als Python, das => ist hier übrigens semantisch auch nur ein (sog. "fettes") Komma.
Mit => wird optisch klarer das es sich um ein hash handelt...
#Kein Kommentar
 2009-02-22 23:54
#119072 #119072
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
guten abend,

1) das '-' hat keine perlspezifische bedeutung. es dient lediglich zur besseren optischen übersicht beim erstellen von widgets und soll parameternamen kennzeichnen.

2) $main ist ein objekt, dessen methode ->Label() ein neues label-objekt erzeugt.

3) das '=>' wird in perl benutzt, um die zuordnung von schlüsseln und werten in einem hash deutlich zu machen. man kann stattdessen auch ein normales komma schreiben, aber dann sind die zuordnungen für den programmier nicht mehr so leicht zu erkennen. zum beispiel:
Code: (dl )
1
2
3
4
5
# schlecht zu lesen:
my %hash = ('key1', 'value1', 'key2', 'value2', 'key3', 'value3',);

# besser zu lesen:
my %hash = (key1 => 'value1', key2 => 'value2', key3 => 'value3',);

zudem musst du bei der ersten möglichkeit auch noch jeden key in quotes setzen, während bei der zweiten möglichkeit perl automatisch merkt, dass key ein string ist.
siehe mehr hier
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
LanX-
 2009-02-23 00:00
#119073 #119073
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
hlubenow+2009-02-22 21:54:37--
Code: (dl )
my $label = $main->Label(-text => 'Hello, world!');

Was bedeutet die Zeile aus OOP-Sicht ? "$main" scheint ein Objekt zu sein (oder eine Referenz auf ein Objekt ??), mit "->" wird eine Methode aufgerufen (oder ein neues Label-Objekt instantiiert ??), dieses "=>" gibt es bei Hashes, was bedeutet das, ist "-text" ein Hash-Key ?


Beim Objektmodell hat sich Larry bei Python inspirieren lassen. Aber mit TK kennen ich mich nicht aus.

$main ist entweder eine Objektrefrenz oder der Name einer Klasse.
mit "->" wird eine Methode aufgerufen, je nachdem Instanz oder Klassenmethode.

"oder ein neues Label-Objekt instantiiert "
wahrscheinlich, aber wenn du ein Tutorial schreibts solltest du dich in TK besser auskennen als ich.... oder ; -)
LanX-
 2009-02-23 03:18
#119074 #119074
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Hat mir keine Ruhe gelassen und es mal getestet, das Minus ist Namensbestandteil des Hashkeys und kein Syntaktisches Element.

da hab ich wohl was durcheinandergebracht ...

aus ProPerl/properl2-5.html
Code: (dl )
1
2
3
4
We can also write the subroutine so that it accepts both named parameters and a simple list. One
common technique borrowed from UNIX command line switches is to prefix named arguments with a
minus, to distinguish them from unnamed arguments. To determine how the subroutine has been called,
we just check the first character of the first parameter to see if it is a minus:



habs mal getestet, das Minus ist Namensbestandteil des Hashkeys und kein syntaktisches Element. Der Sinn dahinter ist es subs schreiben zu können die wahlweise positionale Parameter oder benannte Parameter haben. Dann kann man beim durchsuchen der Parameterliste diejenigen Parameter die mit "-" Anfangen als Hashkeys interpretieren.

In PBP wird dies übrigens abgelehnt, will man benannte Parameter übergeben und mischen, solle man lieber gleich eine Hashreferenz Literal erzeugen, also:

Code (perl): (dl )
subname ( {key1=>"value1", ...}, pos1, pos2,...)


Und ich hab jetzt auch die Quelle meiner Verwirrung lokalisiert! CGI.pm!

Code: (dl )
1
2
3
4
5
       Each argument name is preceded by a dash.  Neither case nor order mat&#8208;
ters in the argument list. -type, -Type, and -TYPE are all acceptable.
In fact, only the first argument needs to begin with a dash. If a dash
is present in the first argument, CGI.pm assumes dashes for the subse&#8208;
quent ones.
CGI

bleibt die Frage ob Perl/Tk positionale und benannte Parameter mischt. Wohl,oder?


---
//Modedit Gwendragon: Link repariert
---
hlubenow
 2009-02-24 00:53
#119088 #119088
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
Hallo,

vielen Dank für eure Antworten. Das hat mir schonmal sehr geholfen. Ganz allmählich komme ich etwas mehr rein. Hash direkt als Referenz übergeben, ist ja schon alles etwas fortgeschritten ...
Quote
aber wenn du ein Tutorial schreibts solltest du dich in TK besser auskennen als ich.... oder ; -)

Stimmt. Mein Tutorial ist aber über Python/Tkinter. Dort gibt's den Bindestrich nicht. (Die Optionen sind dort gewöhnliche Funktions-Argumente, die an den Konstruktor für das neue Widget übergeben werden.)

Ich glaube, die genaue Antwort kann man irgendwo im Code der Tk-Module finden. Da werde ich also mal noch etwas weiter suchen. "grep" ist bei sowas immer recht hilfreich.

Viele Grüße
#Kein Kommentar
 2009-02-24 00:56
#119089 #119089
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
wie schon gesagt meines wissens nach gehören die bindestriche einfach zum namen des schlüssels und mehr versteckt sich auch nicht dahinter.
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
Crian
 2009-02-24 13:20
#119096 #119096
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ja, das sehe ich auch so.
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
LanX-
 2009-02-24 17:30
#119109 #119109
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
#Kein Kommentar+2009-02-23 23:56:32--
wie schon gesagt meines wissens nach gehören die bindestriche einfach zum namen des schlüssels und mehr versteckt sich auch nicht dahinter.


naja es versteckt sich was dahinter, es ist aber kein Bestandteil der Sprache sondern wie gesagt eine beliebte Technik von manchen Modulautoren.

Um es ganz genau zu machen, bei einem Sub-Aufruf wird eine Liste von Skalaren übergeben, ob diese aus einem Hash, einem Array, oder einer Literalen Liste stammt kann das Sub nicht wissen (es sei den man übergibt explizit Referenzen)

Code (perl): (dl )
1
2
dosub(@array,%hash,"literale ","Listen ","Elemente"); # alle arrays und hashes werden zur Liste abgeflacht
# In Sprachen wie Python oder JS ist würden hier an den ersten beiden Positionen Referenzen übergeben, weil dort IMHO alles eine Referenz oder ne Konstante ist.


manche Autoren wollen aber die Möglichkeit wahlweise benannte Parameter statt positionaler zu übergeben. Sie prüfen dann die ersten Elemente in @_ nach 2er-Gruppen, bei denen der erste Skalar mit einem dash beginnt. Bleibt der Dash aus solls ein positionale Liste sein. Kommt ein Dash wird er dann natürlich entfernt wenn die Variable gesetzt wird.

CPAN:CGI macht es genau so. Ob CPAN:Tk es auch so macht oder aus schlichter Gewohnheit die dashes anbringt und grundsätzlich immer benannte parameter möchte weiß ich jetzt nicht. Viele Leute sind dashes von Unixaufrufen gewohnt.

Anwendungsbeispiel

Ich weiß noch das Lichtkind letztens in Frankfurt über WxPerl vorgetragen hat und es mir ziemlich gruselte als er lobte wie schnell man sich an die zig Parameter langen positionalen Aufrufe gewöhnt...
(habs dann gleich die Aussprache in WixPerl geändert)

Genau hier könnte nun der Modulautor oben beschriebene Technik einsetzen um jetzt optional benannte Parameter nachträglich zu erlauben OHNE die Rückwärtskompatibilität kapput zu machen.

Conways Vorschlag in PBP find ich übrigens viel sinniger statt Dashes lieber ein Hashref zu übergeben. Ist das erste Listenelement ein Hashref weiß man das es kein positionaler Parameter ist. (selbstverständlich sollte als erster positionaler Parameter kein Hashref erlaubt sein ; ) Man spart viele Dashes für nur 2 zusätzliche Curlies!
LanX-
 2009-02-24 18:06
#119112 #119112
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
hlubenow+2009-02-23 23:53:19--
Stimmt. Mein Tutorial ist aber über Python/Tkinter. Dort gibt's den Bindestrich nicht. (Die Optionen sind dort gewöhnliche Funktions-Argumente, die an den Konstruktor für das neue Widget übergeben werden.)


Na jetzt must du uns aber erklären was "gewöhnliche Funktions-Argumente" in Python/Tkinter sind. Nur positional oder auch benannt?

Ich würd ja bei denen http://www.python-forum.de/ fragen aber, die haben so einen komischen Ton ...

(so in der Art "frag ja nix blödes über mein Mofa sonst drück ich dir die Akne aus!!!" und "coole Jungs steigen immer von links auf, wer von rechts aufsteigt ist blöd!" ;-)
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2009-02-22 22:54.