Grundsätzlich kannst du "rechnewas()" schon austauschen, aber wie bereits gesagt wäre dies dann global so und überall dann der Fall, es ist nicht so das du eine Präzendenz oder ähnliches hast.
Unabhängig davon würde ich das austauschen in solch einem Fall aber auch nicht empfehlen da dies absolut undurchschaubar nachher wird welche Subroutine mit rechnewas() überhaupt noch aufgerufen wird.
Ansonsten wäre das was du schreibst eigentlich wirklich ein sehr guter Fall für OOP und die Polymorphie, da du genau dort soetwas hast. Du leitest eine Klasse ab und erstellst eine neue Klasse, und in deiner abgeleiteten klasse kannst du rechnewas() einfach mit einer neuen Logik überschreiben. Alle die deine alte Klassen nutzen sehen davon nichts, und alle die deine abgeleitete klasse nutzen sehen eine neue Methode die etwas anderes macht. Das wäre auch wartbar. Wobei ich nicht uneingeschränkt empfehlen würde wenn eine abgeleitete Klasse eine Methode überschreibt und diese dann etwas ganz anderes macht.
Noch besser wäre es dann am ende wirklich soetwas wie Moose zu haben und Rolen zu nutzen und solche methoden in Rollen zu packen die du dann nutzt um neue klassen zusammenzubauen und dort Methoden beim zusammenbau der Klasse überschreibst.
Ansonsten ohne OOP fällt mir kein wirklicher weg ein um dein Ziel zu erreichen. Du kannst zwar Funktionen überschreiben und austauschen aber wie gesagt gibt es dann keine Präzedenz oder ähnliches.
Einzige andere Möglichkeit wäre vielleicht noch wenn du vielleicht beschreibst warum du soetwas brauchst. Vielleicht findet sich ja eine ganz andere Möglichkeit.
Zum beispiel eine Dispatch Tabelle. Du kannst ein Hash nehmen wo du subroutinen abspeicherst. zum beispiel
my $operation2func = {
'add' => sub { return $_[0] + $_[1] },
'sub' => sub { return $_[0] + $_[1] },
'rnd' => sub { return $_[0] + $_[1] },
};
Diesen Hash übergibst du dann und deine Logik wie auch immer die du hast liest dann aus dem Hash den Wert "rnd" die subroutine aus und diese wird dann genutzt.
Woanders kannst du dann hingehen und den hash kopieren. z.B. mit dem Modul "Clone" und in dem Kopierten hash kannst du dann "rnd" durch eine andere subroutine austauschen, du müsstest dann aber immer den hash mit übergeben damit deine suborutinen wissen aus welchem Pool sie eine Methode auslesen sollen.
Eine andere Möglichkeit wäre es du nutzt callbacks.
Daher wenn du z.B. eine Subroutine hast die irgendwo "rechnewas()" aufruft. Ruft es stattdessen einen callback auf den du selber übergibst.
anstatt also soetwas im code zu haben.
sub irgendwo {
...
rechnewas($x, $y);
...
}
hast du folgendes dort stehen
sub irgendwo {
my ( $callback ) = @_;
...
$callback->($x, $y);
...
}
Daher du musst übergeben was für $callback aufgerufen wird.
In etwa dann so:
irgendwo(\&rechnewas1);
irgendwo(\&rechnewas2);
irgendwo(sub { $_[0] - $_[1] });
P.S.: So bin jetzt bis Sonntag weg. Guten Rutsch!
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de