Hallo, ich möchte eine perl-Funktion so einpacken, daß ich ein paar Parameter überprüfen kann. Beispiel: Die Original-Perl-Funktion lautet sagenwirmal: machwas ( $wer , $was , $wo ); Wenn man $wer als "Schwiegermutter" übergibt, schmiert die Kiste ab. Also will ich sowas machen: sub my_machwas { my ( $wer , $was , $wo ) = ( @_ ); if ( $wer eq "Schwiegermutter) { die "Keiner zuhause! Geh weg!\n"; } else { machwas ( $wer , $was , $wo ); # Original-Funktion } } Schön. Tippfehler mal aussen vor, ich habe das jetzt so runtergetippert. Nun ist es aber leider so, das der Befehl, den ich verpacken will, seine Parameter so bekommt: machwas( wer => 'Schwiegermutter" , was => 'rumnoergeln' , wo => 'MEINE WOHNUNG!" ) Ähm... was setze ich denn dann oben statt my ( $wer , $was , $wo ) = ( @_ ); ? Ich hatte probiert my ( $wer , $was , $wo ) = ( %_ ); das geht nicht. Wie nennt man denn diese Art der Parameterübergabe, und in welchem perldoc wäre ich fündig geworden? Irgendwie gestaltet sich das Googeln nach Sonderzeichen recht schwierig. :-) Der Knackpunkt ist, daß das statt wer,was,wo sehr viele Parameter möglich wären, von denen man normalerweise nur sehr wenige setzt (Wen es interessiert: Es geht mal wieder um Annotate aus perlmagick). Schönen Sonntag euch, Ratti -- -o) fontlinge | Font management for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Am Sonntag, 18. Januar 2004 09:52 schrieb Joerg Rossdeutscher:
machwas( wer => 'Schwiegermutter" , was => 'rumnoergeln' , wo => 'MEINE WOHNUNG!" )
Ähm... was setze ich denn dann oben statt my ( $wer , $was , $wo ) = ( @_ ); ? Ich hatte probiert my ( $wer , $was , $wo ) = ( %_ ); das geht nicht. Wie nennt man denn diese Art der Parameterübergabe, und in welchem perldoc wäre ich fündig geworden? Irgendwie gestaltet sich das Googeln nach Sonderzeichen recht schwierig. :-)
Das Ding heisst "Grosser Pfeil" und gehört zum Thema "hash". Ein Hash ist Feld wo mehrere Wertepaare stehen. Ein Key und ein Value. Und um die Lesbarkeit zu steigern kann man den grossen Pfeil benutzen. Bei "wer => schwiegermutter" ist "wer" der Key und "schwiegermutter" das Value. Man könnte das Ding auch als Komma sehen. -- Andreas
Moin, Am So, den 18.01.2004 schrieb Andreas Winkelmann um 10:55:
Am Sonntag, 18. Januar 2004 09:52 schrieb Joerg Rossdeutscher:
machwas( wer => 'Schwiegermutter" , was => 'rumnoergeln' , wo => 'MEINE WOHNUNG!" )
Ähm... was setze ich denn dann oben statt my ( $wer , $was , $wo ) = ( @_ ); ? Ich hatte probiert my ( $wer , $was , $wo ) = ( %_ ); das geht nicht. Wie nennt man denn diese Art der Parameterübergabe, und in welchem perldoc wäre ich fündig geworden? Irgendwie gestaltet sich das Googeln nach Sonderzeichen recht schwierig. :-)
Das Ding heisst "Grosser Pfeil" und gehört zum Thema "hash". Ein Hash ist Feld wo mehrere Wertepaare stehen. Ein Key und ein Value. Und um die Lesbarkeit zu steigern kann man den grossen Pfeil benutzen. Bei "wer => schwiegermutter" ist "wer" der Key und "schwiegermutter" das Value. Man könnte das Ding auch als Komma sehen.
OK, danke, was hashes sind, weiss ich, dann ist das => also nur eine andere Art der Notation. Warum geht das nicht: #!/usr/bin/perl -w use warnings; use strict; t( name => "joerg" , nick => "ratti" ); sub t { my %x = %_ ; # <---- Hier! Was muss hier hin???????? print $x{name},"\n"; } Die markierte Zeile ist falsch, und daher is $x{name} undefiniert. Wieso? Was muss da hin? Gruß, Ratti -- -o) fontlinge | Font management for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Moin,
* Joerg Rossdeutscher
sub t { my %x = %_ ; # <---- Hier! Was muss hier hin???????? print $x{name},"\n"; }
sub t { my %x = @_; print $x{name},"\n"; } Was in Perl keine Liste ist, kannst Du an den Fingern einer Hand abzählen. Auch Hashes sind Listen. Thorsten -- Whenever there is a conflict between human rights and property rights, human rights must prevail. - Abraham Lincoln
Am So, den 18.01.2004 schrieb Thorsten Haude um 12:42:
my %x = @_;
Ah!
Was in Perl keine Liste ist, kannst Du an den Fingern einer Hand abzählen. Auch Hashes sind Listen.
Verstehe. Bei einer Zuweisung einer "normalen" Liste zu einem Hash wird die Liste als (key,value)-Paare interpretiert. Das ist sehr klug. :-) Ich tu mir noch etwas schwer mit der "typenlosigkeit" und Flexibilität von Perl. Sehr undeutsche Sprache. :-) Ich bin echt begeistert. Danke für deine Hilfe. Gruß, Ratti -- -o) fontlinge | Font management for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Moin,
* Joerg Rossdeutscher
Nun ist es aber leider so, das der Befehl, den ich verpacken will, seine Parameter so bekommt:
machwas( wer => 'Schwiegermutter" , was => 'rumnoergeln' , wo => 'MEINE WOHNUNG!" )
Ähm... was setze ich denn dann oben statt my ( $wer , $was , $wo ) = ( @_ ); ?
Das ist nichts anderes als eine fantasievolle Schreibweise für eine Liste, mit der man vor allem Hash initialisiert. Entweder schreibst Du das händisch jeweils in key und value oder Du initialisierst einen Hash damit. In Deinem Fall ist wohl ersteres zu bevorzugen.
in welchem perldoc wäre ich fündig geworden?
Im Kamelbuch steht es IIRC bei den Hashes, such mal da.
Der Knackpunkt ist, daß das statt wer,was,wo sehr viele Parameter möglich wären, von denen man normalerweise nur sehr wenige setzt (Wen es interessiert: Es geht mal wieder um Annotate aus perlmagick).
Eben, die anderen Werte bleiben halt auf Defaultwerten. Thorsten -- Try not to be a man of success but rather of value. - Albert Einstein
Hallo, Am Sun, 18 Jan 2004, Joerg Rossdeutscher schrieb: [..]
Nun ist es aber leider so, das der Befehl, den ich verpacken will, seine Parameter so bekommt:
machwas( wer => 'Schwiegermutter" , was => 'rumnoergeln' , wo => 'MEINE WOHNUNG!" )
Ähm... was setze ich denn dann oben statt my ( $wer , $was , $wo ) = ( @_ ); ?
man -P'less +/%map' perldata sub my_machwas { my %args = @_; ... } -dnh -- So wie yast2 [auf der Konsole] zur Zeit aussieht, ist es das Outlook unter den Konsolenprogrammen: Nämlich die alleinseligmachende, fortgesetzte Normverletzung unter Vorgabe guter Motive. -- "ratti" in suse-linux
participants (4)
-
Andreas Winkelmann
-
David Haller
-
Joerg Rossdeutscher
-
Thorsten Haude