Auslagern von Variablen
piet
- perl
Hallo,
ich möchte gerne immer benötigte Variablen auslagern.
Wie ich eine externe Funktion (Funktion in anderen "Datei") mit use initialisiere und dann aufrufe/anspringe weiß ich.
Wie stelle ich es aber an das nur durch use xyz die Variablen initialisiert werden.
Ich kann es schlecht erklären hier ein Beispiel.
#################################################
allgemein.pm
my $host = split(/\./,hostname);
....
....
....
Wenn ich nun in meinem Hauptprogramm
use allgemein;
Aufrufe sollte der Code für die Variable $host ausgeführt sein... also nur durch use ohne Aufruf einer speziellen Funktion.
Danach möchte ich auf die Variable $host im Hauptprogramm zugreifen können... nur wie.
Ich weiß nicht ob das überhaupt geht.... aber sicher ähnlich möglich. Vielleicht gibt es eine "Initialisierungfunktion" für allgemein.pm
Grüsse
piet
hi,
Ich weiß nicht ob das überhaupt geht.... aber sicher ähnlich möglich. Vielleicht gibt es eine "Initialisierungfunktion" für allgemein.pm
Wenn Du ein
use Foo;
notierst, wird die Methode Foo::import() aufgerufen. Diese Methode wird nicht aufgerufen, wenn Du
require Foo;
oder
use Foo ();
notierst.
Hotti
Hello,
Wie stelle ich es aber an das nur durch use xyz die Variablen initialisiert werden.
allgemein.pm
my $host = split(/./,hostname);
....
....
....
>
> Wenn ich nun in meinem Hauptprogramm
>
> use allgemein;
>
> Aufrufe sollte der Code für die Variable $host ausgeführt sein... also nur durch use ohne Aufruf einer speziellen Funktion.
Du könntest (die bei mir unbeliebte) OOP verwenden, Da kannst Du Variablen ganz einfach kapseln.
Du könntest das aber auch in der prozeduralen Programmierweise erreichen durch Verwendung von Funktionen und des Schlüsselwortes "static".
function get\_myhost($hostname)
{
static $my\_host = false;
if (!$my\_host)
{
$my\_host = split(/\./,$hostname);
}
return $my\_host;
}
siehe auch z. B. <http://www.php.de/php-einsteiger/84185-statische-variablen.html>
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
☻\_
/▌
/ \ Nur selber lernen macht schlau
<http://restaurant-zur-kleinen-kapelle.de>
Hello,
bitte um Entschuldigung. Hier ging es um Perl, das habe ich eben überlesen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
bitte um Entschuldigung. Hier ging es um Perl, das habe ich eben überlesen.
Ab Perl v5.010 gibts auch static, da heißt es state. Für ältere Perl-Versionen gibts Alternativen, die genausogut funktionieren. Das hilft aber auch nicht weiter, wenn mal eben irgendeine Variable gebraucht wird. Und es ist auch nicht stilvoll, irgendwelche Variablen einfach so zu setzen, wenn irgendwann einmal darauf zugegriffen werden soll.
In Perl's OOP-Philosophie heißt es u.a.: Ein Objekt ist nur deswegen ein Objekt, weil es weiß, zu welcher Klasse es gehört (bless). Will meinen, eine Kapselung funktioniert auch ohne OOP. Aber das nur nebenbei.
Es gibt in Perl das Schlüsselwort our, darüber (ähnlich use vars(), also eine Vorwärtsdeklaration) lassen sich Variablen über später eingebundene Module nachladen, aber auch das kann schnell sehr unübersichtlich werden.
Und insgesamt, hängts alles irgendwie am Gesamtkonzept. Teamarbeitsfreundlich ist jedoch die Verwendung von Funktionen, die automatisch nachgeladen werden. Ein Blick in die dafür zuständige AUTOLOAD() genügt, zu sehen, wo die herkommen. Letztendlich brauchts in einer gut durchdachten Singleton-Factory nicht einmal eine Instanz, es wird einfach eine Methode aufgerufen, fertig, Beispiel:
$user = $singleton->user($user_kennung);
und schwubbs, habe ich Vorname, Nachname, PLZ, Ort usw. Über Säugetiere, Lurche und Fische...
Hotti
Dir schwebt vor:
package allgemein;
use Sys::Hostname qw(hostname);
our ($host) = split(/\./,hostname);
1;
anderenorts:
use allgemein;
print $allgemein::host;
Das funktioniert, ist allerdings kein guter Stil, da es fremden Code erlaubt, die Variable zu überschreiben. Das ist keine gute Idee wegen potenziellem AaaD.
Solche Variablen sollen entweder bei der Initialisierung schreibgeschützt werden (aber das versteckt nur die Symptome), oder besser deren Werte in einer Subroutine (oder wenn du später auf OOP umsteigst, in einem Klassenattribut) gekapselt sein.
package allgemein;
use Sub::Exporter -setup => { exports => [ qw(host) ] };
use Sys::Hostname qw(hostname);
sub host {
return (split(/\./,hostname))[0];
}
1;
anderenorts:
use allgemein qw(host);
print host;
Hallo,
package allgemein;
use Sub::Exporter -setup => { exports => [ qw(host) ] };
use Sys::Hostname qw(hostname);
sub host {
return (split(/./,hostname))[0];
}
1;
>
> anderenorts:
>
> ~~~perl
use allgemein qw(host);
> print host;
natürlich gefällt mir die package Variante besser (auch von selfhtml vorgestellt) ... aber wenn Ihr meint diese Variante ist sicherer... das soll mir nur Recht sein.
Wie sieht diese Variante mit mehr als einer Variable aus... und warum wird vor den Variablen kein '$' geschrieben.
Danke
piet
natürlich gefällt mir die package Variante besser (auch von selfhtml vorgestellt)
SelfHTML ist kein gutes Lehrmaterial für Perl.
Wie sieht diese Variante mit mehr als einer Variable aus
Analog. Definiere und exportiere weitere Subroutinen, welche jeweils einen Wert oder Liste von Werten zurückgeben.
und warum wird vor den Variablen kein '$' geschrieben.
Weil das eine importierte Subroutine ist und keine Skalarvariable.
hi,
Das funktioniert, ist allerdings kein guter Stil, da es fremden Code erlaubt, die Variable zu überschreiben. Das ist keine gute Idee wegen potenziellem AaaD.
Das Beispiel ist an den Fingernägeln herbeigezogen. Ich kenne keinen, der $[ jemals verwendet hätte.
use allgemein qw(host);
print host;
Das ist nicht Dein Ernst. Da kannst Du auch gleich die Variable selbst importieren anstatt die Kirche ums Dorf zu tragen.
Schönen Sonntag!