Schrift
[thread]6933[/thread]

Parameterprüfung bei Sub



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Gast Gast
 2005-04-26 19:31
#54254 #54254
Hi Leute!

Ich hab folgendes Problem:
ich möchte von meiner "main" eine Sub-Funktion aufrufen.
Je nachdem welche unterschiedlichen und beliebig vielen Parameter übergeben werden verhält sich die Funktion anders. Auch die Reihenfolge soll dabei egal sein. Also müssen die Parameter identifiziert werden.
Bsp:
($wert)
($wert, 'eu' )
($wert, 'Punkt' )
($wert, 'bla', 'Punkt', $n_wert)


ein Kollege schrieb mir diesen kurzen Code. Allerdings verstehe ich ihn nicht ganz und bekomme ihn auch nicht lauffähig, damit ich selber damit experimentieren könnte. Leider sehe ich den Kollegen in nächster Zeit nicht mehr.

Vielen Dank im voraus!

Bye, Nemesis_SJ

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sub test {
     my $self = shift;
    my %args = @_;

     if (not defined $args{opt_parameter}) {
             $args{opt_parameter} = 17;
     }

     if ($args{name} eq 'eu' ) {
             ....
    }

}

sub aufrufer {
     $obj->test(name => 'eu', zeit => 17.8);
}


edit pq: code-tags hinzugefügt\n\n

<!--EDIT|pq|1114530317-->
pq
 2005-04-26 19:44
#54255 #54255
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Wiki:Wie frage ich bei Perl-Community.de?, insbesondere Code-Tags
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
Taulmarill
 2005-04-27 12:12
#54256 #54256
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
die zeile mit my $self = shift; solltest du nur verwenden, wenn sich deine subroutine in einem anderen package befindet bzw. wenn du objektorientiert arbeitest.
bei "normalen" subroutinen könnte man den aufruf evtl. so machen my_sub( 'name' => 'Max Muster', 'alter' => 25 ).
eine passende subroutine könnte so aussehen (ungetestet):
Code: (dl )
1
2
3
4
5
6
7
sub my_sub {
my %args = @_;
for $key ( sort keys %args ) {
print "$key = $args{$key}\n";
}
return 1;
}
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
ptk
 2005-04-27 12:43
#54257 #54257
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich missbrauche gerne Getopt::Long fuer eine cmdline-aehnliche Parameterebergabe. Damit hat man auch gleich die Sicherheit, dass keine falschen Optionen verwendet wurden und man kann den Typ der Option angeben (Integer, String, Boolean).

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
use Getopt::Long;
sub my_sub {
local @ARGV = @_;
my %args;
GetOptions(\%args, "name=s", "alter=i") or die "wrong usage!";
for my $key ( sort keys %args ) {
print "$key = $args{$key}\n";
}
return 1;
}
my_sub(-name => "ich", -alter => 19);
Taulmarill
 2005-04-27 12:55
#54258 #54258
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
wird nur schwierig über Getopt::Long referenzen auf datenstrukturen zu übergeben, oder?
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
ptk
 2005-04-27 13:55
#54259 #54259
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Es scheint zu funktionieren, mit "s" als Getopt-Typ. Allerdings weiss ich nicht, ob man sich darauf verlassen kann...
sri
 2005-04-27 14:42
#54260 #54260
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=ptk,27.04.2005, 10:43]Ich missbrauche gerne Getopt::Long fuer eine cmdline-aehnliche Parameterebergabe. Damit hat man auch gleich die Sicherheit, dass keine falschen Optionen verwendet wurden und man kann den Typ der Option angeben (Integer, String, Boolean).
[/quote]
Da nehm ich aber lieber Params::Validate... ;)
Dubu
 2005-04-27 14:46
#54261 #54261
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Taulmarill,27.04.2005, 10:12]die zeile mit my $self = shift; solltest du nur verwenden, wenn sich deine subroutine in einem anderen package befindet bzw. wenn du objektorientiert arbeitest.[/quote]
Der Aufruf $obj->test(name => 'eu', zeit => 17.8); aus dem Beispiel sieht schon ziemlich objektorientiert aus, insofern ist der Code wohl korrekt und sollte so funktionieren.

Leider hat uns Nemesis nicht gesagt, wo genau jetzt seine Probleme liegen ...
ptk
 2005-04-27 15:52
#54262 #54262
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=sri,27.04.2005, 12:42][quote=ptk,27.04.2005, 10:43]Ich missbrauche gerne Getopt::Long fuer eine cmdline-aehnliche Parameterebergabe. Damit hat man auch gleich die Sicherheit, dass keine falschen Optionen verwendet wurden und man kann den Typ der Option angeben (Integer, String, Boolean).
[/quote]
Da nehm ich aber lieber Params::Validate... ;)[/quote]
Igitt, ein weiteres PREREQ_PM... neenee, ich musste mich gestern mit Windows und nicht funktionierendem ppm, manuellen Suchen von nmake und so rumschlagen.
sri
 2005-04-27 16:36
#54263 #54263
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Tststs...windows, laesst die besten Programmierer schlechten code schreiben...

Wenn ich mir die Longhorn previews so anschau wirds nur noch schlimmer, einfach erbaermlich... (ich jedenfalls freu mich schon sehr auf Mac OS X Tiger am Freitag) ;)
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2005-04-26 19:31.