Sebastian: Paramter in Subroutine in eigenem Modul auslesen

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

  1. 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.

    1. 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

      1. 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

  2. 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!