Subroutine doppelt verwenden ?
$xNeTworKx
- perl
0 Cheatah0 $xNeTworKx0 Michael Schröpl0 $xNeTworKx0 Cheatah0 $xNeTworKx0 Klaus Mock
Hallo,
ich weis nicht was da los ist, aber ich finde mein gestriges Posting nicht mehr, also hoffe ich, es stört nicht, wenn ich heute nochmal frage.
Ich wollte wissen, ob es möglich ist wenn ich zB eine Subroutine so aufrufe..... :
aendern($text);
.
.
.
sub aendern {
my $text = shift;
$$text =~ s/"/"/g;
}
das ich die gleiche Subroutine mit einer anderen Variable verwende, also zB mit :
andern($thema);
Es muss doch irgendwie möglich sein, die obrige Subroutine auf eine andere Variable anzuwenden, oder ?
$xNeTworKx.
Hi,
Es muss doch irgendwie möglich sein, die obrige Subroutine auf eine andere Variable anzuwenden, oder ?
ist es. Hast Du damit irgendwelche Probleme erfahren? Wenn ja, wie äußerten sich diese?
Cheatah
Hi,
ist es. Hast Du damit irgendwelche Probleme erfahren? Wenn ja, wie äußerten sich diese?
nun ja, Die Subroutine beinhaltet doch eine Referenz auf $text, aber wenn ich die Subroutine für $thema verwenden will, wie kann ich der Subroutine dann beibringen, ohne sie zu verändern, daß sie $thema verändern soll, und nicht $text ?
$xNeTworKx.
HI auch,
nun ja, Die Subroutine beinhaltet doch eine Referenz auf $text,
aber wenn ich die Subroutine für $thema verwenden will, wie kann
ich der Subroutine dann beibringen, ohne sie zu verändern, daß
sie $thema verändern soll, und nicht $text ?
sie soll weder das eine noch das andere tun.
Was sie tun soll, das ist, ihren einzigen Parameter als Referenz auf
was auch immer zu interpretieren.
Auf welche tatsächliche Variable diese Referenz zeigt, geht die Funktion
gar nichts an - und nur genau _dadurch_ wird sie mehrfach verwendbar.
Viele Grüße
Michael
Hi,
Was sie tun soll, das ist, ihren einzigen Parameter als Referenz auf
was auch immer zu interpretieren.
Auf welche tatsächliche Variable diese Referenz zeigt, geht die Funktion
gar nichts an - und nur genau _dadurch_ wird sie mehrfach verwendbar.
ja genau das meine ich, aber wie kann ich die Subroutine "verallgemeinen" ?. Also die Referenz ist das Problem. Auf was soll ich eine Referenz ausgeben, wenn die Variable allgemein sein soll ? Das ist nämlich das, was ich nicht verstehe.
$xNeTworKx.
Hi,
ja genau das meine ich, aber wie kann ich die Subroutine "verallgemeinen" ?
sie ist bereits hinreichend allgemein. Wenn Du Dich am "my $text=shift;" störst, dann schreib einfach "my $variable_die_es_garantiert_nur_hier_gibt=shift;" - inhaltlich hast Du das aber schon :-)
Cheatah
Hi,
sie ist bereits hinreichend allgemein. Wenn Du Dich am "my $text=shift;" störst, dann schreib einfach "my $variable_die_es_garantiert_nur_hier_gibt=shift;" - inhaltlich hast Du das aber schon :-)
hmmm du hast Recht :). Irgendwie funktioniert das.
$xNeTworKx.
Hallo,
hmmm du hast Recht :). Irgendwie funktioniert das.
Das funktioniert nicht nur 'irgendwie', sondern genau so, wie es soll.
Dein Problem war eigentlich nur, daß Du in der Funktion zufälligerweise den gleichen Namen für eine funktionslokale Variable benutzt hast, den Du auch für die, diesmal globale[1] Variable verwendet hast. Die Betonung liegt dabei auf 'zufällig'.
BTW: ich hätte das übrigens anders, ohne Referenz gelöst:
$text = aendern($text);
sub aendern {
my $text = shift;
$text =~ s/"/"/g;
return $text;
}
Der Vorteil ist, daß Du bei dieser Lösung auch
$wasauchimmer = aendern($irgendwasanderes);
schreiben kannst, wenn Du den Inhalt von $irgendwasanderes später eventuelle nochmals brauchst.
Der Nachteil ist allerdings, daß mehr Daten hin und her übergeben werden könnten. Ob das auch wirklich so ist, weiß ich nicht, da ich mich noch nicht soweit mit den Internas von Perl auseinander gesetzt habe. Aber ich denke doch, daß die gesamten Daten übergeben werden und nicht nur eine Verwaltunsgstruktur.
So ist es nur ein Beispiel mehr, daß es mehrer Wege zum Ziel gibt. Und daß meist jeder dieser Wege ein Für und Wider hat.
Grüße
Klaus
[1] wobei diese, durch die Referenz übergebene, Variable auch durchaus in einer anderen Funktion lokal sein kann, aber davon weiß die aufgerufene Funktion nichts.
Hallo,
ich verwende eigentlich Referenzen, da diese ja effizienter sein sollen, überhaupt bei großen Projekten, wie bei einem Forum von mir.
Desweiteren habe ich zwar am Anfang mit return $variable gearbeitet, aber ich bilde mir ein, daß ich manchmal Probleme hatte, die Variable ausserhalb von Sub. zu verändern, aber vielleicht lag es an was anderem, aber ich werde mir dein Lösung auf jeden Fall nochmal genau ansehen, da ich bei meinem Forum einen "Back" Button habe, wo man, nachdem man die Daten abgeschickt hat, nochmal nachbessern kann, und bis jetzt habe ich immer die Daten wieder zurückverwandelt, was natürlich nicht sehr effizient ist.
$xNeTworKx.
Hallo,
ich verwende eigentlich Referenzen, da diese ja effizienter sein sollen, überhaupt bei großen Projekten, wie bei einem Forum von mir.
Effizienz ist so eine Sache. Ich denke Referenzen bringen nur etwas bei größeren Datenmengen, um Speicherplatz und Kopierarbeit zu sparen. Wenn die Daten jedoch eine überschaubare Größe haben, dann ist es oft effizenter, den am leichtesten zu lesenden Code zu verwenden. Denn auch Übersichlichtkeit im Code kann/soll ein Optimierungsziel sein.
Desweiteren habe ich zwar am Anfang mit return $variable gearbeitet, aber ich bilde mir ein, daß ich manchmal Probleme hatte, die Variable ausserhalb von Sub. zu verändern, aber vielleicht lag es an was anderem,
Da ausserhalb der Funktion nur eine Kopie der Variable vorliegt, kannst Du nicht den Inhalt der Variable in einer Funktion ändern.
aber ich werde mir dein Lösung auf jeden Fall nochmal genau ansehen, da ich bei meinem Forum einen "Back" Button habe, wo man, nachdem man die Daten abgeschickt hat, nochmal nachbessern kann, und bis jetzt habe ich immer die Daten wieder zurückverwandelt, was natürlich nicht sehr effizient ist.
Nein, das ist auch nicht effizent, vor allem, weil es günstiger ist, eine Variable zu kopieren, als den Verarbeitungsprozeß zeweimal zu machen.
Grüße
Klaus