Paramter in Subroutine in eigenem Modul auslesen
Sebastian
- perl
Hi Leute,
wie lese ich eigentlich am besten an eine SubRoutine übergebene Parameter in einem eigenen Modul in Perl aus?
Ich weiß zwar bisher, dass es einerseits über
my value = shift(@_);
oder
my ($value1, $value2, ...) = @_;
geht, ich habe dann aber keine exakte Zuweisung eines Wertes einer bestimmten Variable, wenn ich sie mal nicht in der exakten Reihenfolge übergebe. Wenn ich nun aber möchte, dass eine bestimmte Variable immer genau den für sie bestimmten Wert zugewiesen bekommt, habe ich demanch also ein Problem.
Die einzige Lösung, die ich im Moment, ich bin in dem Ganzen nach einem halben Jahr noch nicht so bewandert, nun kenne, ist der Subroutine jeweils einen Paramter auf folgende Art zu übergeben:
&modul::subRoutine(NameDesParameters1=$WertDesParameters1, NameDesParameters2=$WertDesParameters2,...);
Auslesen würde ich dann die Daten innerhalb der SubRoutine mit
foreach $parameter (@_) {
($name, $value) = split('=', $parameter);
$ENV{$name} = $value;
}
und zurückgeben mit
my $ausgabe = ...;
return $ausgabe;
Da gibt es doch bestimmt einen effektiveren Weg (mit globalen Variablen wäre das ganze ja kein Problem -> entgegen jeglichem auberen Programmierstil!!)?
Ich kann das doch nicht in jede Subroutine einfügen, oder muss ich doch?
Könnt ihr mir da also einen Tipp geben. Ich hab schon im fetten O'Reilly-Wälzer rumgesucht und nichts genaueres gefunden...
Danke und MfG Sebastian
wie lese ich eigentlich am besten an eine SubRoutine übergebene Parameter in einem eigenen Modul in Perl aus?
Das steht in perldoc perlsub
, Parameter stehen in der Subroutine in @_.
Ich weiß zwar bisher, dass es einerseits über
my value = shift(@_);
oder
my ($value1, $value2, ...) = @_;
geht, ich habe dann aber keine exakte Zuweisung eines Wertes einer bestimmten Variable, wenn ich sie mal nicht in der exakten Reihenfolge übergebe.
Übergebe die Parameter immer in der richtigen Reihenfolge, dann hast du keine Probleme.
Wenn ich nun aber möchte, dass eine bestimmte Variable immer genau den für sie bestimmten Wert zugewiesen bekommt, habe ich demanch also ein Problem.
So wie bei
sub minus { $_[0] - $_[1] }
printf "%d, %d" => minus(10, 5), minus(5, 10)
Tja, das ist Absicht.
Die einzige Lösung, die ich im Moment, ich bin in dem Ganzen nach einem halben Jahr noch nicht so bewandert, nun kenne, ist der Subroutine jeweils einen Paramter auf folgende Art zu übergeben:
&modul::subRoutine(NameDesParameters1=$WertDesParameters1, NameDesParameters2=$WertDesParameters2,...);
Auslesen würde ich dann die Daten innerhalb der SubRoutine mit
foreach $parameter (@_) {
($name, $value) = split('=', $parameter);
$ENV{$name} = $value;
}
Benutze einen Hash:
sub mysub { my %hash = %{shift} }
mysub( { name => 'wert', name2 => 'wert2', ...} )
Ich habe dein Problem aber nicht wirklich verstanden.
Hallo,
Also nochmal:
Ich möchte einer SubRoutine Parameter übergeben und sie, egal in welcher Reihenfolge ich sie übergebe, immer der richtigen Variable übergeben.
Geht das also nur über NameDerVariable=WertDerVariable als Parameter oder gibt es da noch eine elegantere Möglichkeit?
Sebastian
Moin,
Hallo,
Also nochmal:
Ich möchte einer SubRoutine Parameter übergeben und sie, egal in welcher Reihenfolge ich sie übergebe, immer der richtigen Variable übergeben.
versteh ich zwar auch nicht, warum, aber irgendwie musst du die Variablen ja identifizieren. Ich würde dann wirklich einen Hash an die Subroutine übergeben, dann spartst du dir das splitting...
Geht das also nur über NameDerVariable=WertDerVariable als Parameter oder gibt es da noch eine elegantere Möglichkeit?
Sebastian
Meise
hi!
wie lese ich eigentlich am besten an eine SubRoutine übergebene
Parameter in einem eigenen Modul in Perl aus?
Also normalerweise ist es wirklich so, dass du die Parameter einfach
in der richtigen Reihenfolge übergibst. Falls du das aber nicht
möchtest, solltest du es vielleicht so lösen, wie das auch in einigen
Standard-Perl-Modulen gelöst wird. Zum Beispiel beim CGI-Modul sieht
das folgendermaßen aus:
print $query->popup_menu(-name => 'menu_name',
-values => ['eenie','meenie','minie'],
-default => 'meenie',
-labels => %labels);
Ist also schon ein bisschen ähnlich deinem Versuch: die Keys werden
mit einem - davor geschrieben, der direkt folgende Parameter ist
dann der Wert (=> ist in Perl ein einfaches Synonym für ein Komma).
Im CGI-Modul wird das mit einer Hilfsmethode rearrange() gelöst, die
alle Parameter der Subroutine übergeben bekommt, zusammen mit einer
Art Format-String, die beschreibt, in welcher Reihenfolge die
Parameter zurückgegeben werden sollen.
Die Funktion rearrange() wird dann in jeder eigenen Subroutine
aufgerufen. Je nachdem, ob die Parameter als Liste, als Hash oder
in obigem Format übergeben wurden, werden sie dann neu geordnet, und
als Liste zurückgegeben, die auf die gewünschten lokalen Variablen
verteilt werden kann.
Da das CGI-Modul wohl bei den meisten Perl-Distributionen dabei ist,
kannst du ja selbst mal in den Quellcode von CGI.pm und CGI/Util.pm
schauen, um dir ein Bild davon zu verschaffen, wie diese Methode
anzuwenden ist.
bye, Frank!