Referenzen -- wozu ?
Axeman
- perl
0 Quitschibo0 K@rl0 micha0 Christian Kruse0 Axeman
Hi zusammen,
ich bin grad am durchlesen, wie referenzen funktionieren.
Aber ich verstehe noch nicht, wozu Referenzen gut sind ?
Wenn ich mache:
$var = 5;
$ref_var = $var;
Was bringt mir denn jetzt dieses Referenz ? Könnt ihr mir mal bespiele sagen, wann ich eine Referenz brauchen könnte?
cu
Axeman
Hi,
nunja... das ist ganz einfach... stell dir mal eine Variable vor die sehr groß ist, oder gar einen Hash... wenn du damit einen subroutine aufrufst wird bei einer normalen variablenübergabe ja alles übergeben... sprich der Inhalt der Variable... ist es aber referenziert und du übergibst die Referenz so wird nur eine Art Zeiger auf die Variable übergeben, nicht aber deren Inhalt... somit sparst du dir a) Zeit bzw. bekommst mehr Performance da der Speicher nicht mit dem übergeben der Variablen beschäftigt ist (und bei einem großen Hash kann das schnell in die 100 KB gehen...) und zudem kannst du eine Referenz schöner manipulieren... übergibst du eine Referenz an eine subroutine so brauchst du die referenz nicht zurückgeben um den Wert in geänderter Form zu bekommen... es wird bei einer Referenz alles quasi zentral verwaltet und so tatsächlich in 'echtzeit' verändert... normale Variablen muss man ja mit return zurückgeben, sonst gibts kein Ergebniss... Referenzen sich daher besonders bei größeren Projekten sehr nützlich und wichtig für die Geschwindigkeit des Systems.
CU Quitschi
Hi Axeman,
mal auf Kommandozeilenebene aufrufen:
perldoc perlref
Grüße
K@rl
Hi zusammen,
ich bin grad am durchlesen, wie referenzen funktionieren.
Aber ich verstehe noch nicht, wozu Referenzen gut sind ?
Wenn ich mache:
$var = 5;
$ref_var = $var;
Was bringt mir denn jetzt dieses Referenz ? Könnt ihr mir mal bespiele sagen, wann ich eine Referenz brauchen könnte?
cu
Axeman
mit Referenzen kannst du zum Beispiel Variablennamen (für Variablen, Arrays etc) dynamisch erstellen.
Wenn du zB. eine Konfigurationsdatei mit folgendem Format hast:
[datensatz1]
wert1=1
wert2=2
wert3=3
[datensatz2]
wert1=1
wert2=2
wert3=3
kannst du das einlesen mit
...
while (<DATENSATZDATEI>) {
chomp;
if (/[(.*)]/) { # hier werden die Teile zwischen den eckigen Klammern gefunden
$hashname=$1; # und in $hashname gespeichert
next;
} else {
($key,$value) = split /=/;
$$hashname{$key} = $value; # hier werden die Schlüssel-Wert-Paare in dem hash $hashname (also
} # %datensatz1, %datensatz2 ..) gespeichert
}
...
du kannst auch ganze subroutinen on-the-fly erstellen und aufrufen, ohne dass sie im sourcecode erscheinen und vieles mehr.
Referenzen sind schon eine tolle Sache
Ciao
Micha
[datensatz1]
wert1=1
wert2=2
wert3=3
[datensatz2]
wert1=1
wert2=2
wert3=3
kannst du das einlesen mit
...
while (<DATENSATZDATEI>) {
chomp;
if (/[(.*)]/) { # hier werden die Teile zwischen den eckigen Klammern gefunden
$hashname=$1; # und in $hashname gespeichert
next;
} else {
($key,$value) = split /=/;
$$hashname{$key} = $value; # hier werden die Schlüssel-Wert-Paare in dem hash $hashname (also
} # %datensatz1, %datensatz2 ..) gespeichert
}
...
Hi,
was hat das denn mit Referenzen zu tun ? Du erstellst doch nur mit einer Schleife neue Variablen, aber das sind doch keine Referenzen, oder ?
cu
Axeman
ein kleiner Fehler ausgemerzt (die eckigen Klammern müssen escaped werden)
hatte aber nichts mit dem Thema zu tun :)
...
while (<DATENSATZDATEI>) {
chomp;
if (/[(.*)]/) {
$hashname=$1; # 1.
} else {
($key,$value) = split /=/;
$hashname->{$key} = $value; # 2.
}
}
...
zu 1. $hashname ist tatsächlich nur eine Variable. Sie dient aber
in 2. als symbolische Referenz für den Namen des Hashes, in dem die Schl.-Wert-Paare
gespeichert werden sollen
ciao
Micha
Hallo,
ich bin grad am durchlesen, wie referenzen funktionieren.
Aber ich verstehe noch nicht, wozu Referenzen gut sind?
Referenzen sind gut, um abstrakte Datentypen darzustellen.
Beispielsweise waeren die Pascal-Records oder die C-Structs ein gutes
Beispiel dafuer, wozu man in Perl Referenzen braucht.
Wenn ich mache:
$var = 5;
$ref_var = $var;
Was bringt mir denn jetzt dieses Referenz?
Tja nun, ein denkbar bloedes Beispiel ;-) Das eignet sich wirklich nur
zur Syntax-Erklaerung.
Könnt ihr mir mal bespiele sagen, wann ich eine Referenz brauchen
könnte?
Sicher. Beispielsweise sind Objekte 'nur' Referenzen. Oder besser,
nehmen wir mal einen Abstrakten Datentyp, den man in C so definieren
wuerde (sorry, die Pascal-Syntax ist zu lang fuer mich her, an die
kann ich mich nicht mehr so genau erinnern):
typedef struct s_datatype {
struct {
char *username,*password;
int uid;
} user_infos;
struct {
char *vname,*nname,*street,*city,*country;
long plz;
int hausnummer;
} personal_infos;
} t_datatype;
t_datatype variable = {
{
"ckruse",
"passwort",
100
},
{
"Christian",
"Kruse",
"Ascheberger Strasse",
"Luedinghausen",
"Deuschland",
59348,
15
}
};
In Perl wuerde man das so schreiben:
$var = {
user_infos => {
username => "ckruse",
password => "passwort",
uid => 100
},
personal_infos => {
vname => "Christian",
nname => "Kruse",
street => "Ascheberger Str."
city => "Luedinghausen",
country => "Deuschland",
plz => 59348,
hausnummer => 15
}
};
Wie du sicher siehst, sind das ineinander verschachtelte
Hash-Referenzen. Auf diese Weise laesst sich nahezu jeder beliebige
abstrakte Datentyp nachbilden.
Gruesse,
CK
Hi,
erstmal thx füe deine Antwort.
Aber verstehen tu ich das ganze noch nicht wirklich.
Ich hab mir jetzt nochmal die Perldoc durchgelesen und da
steht was mit anonymen Listen und so. Was sind denn die und vor allem
wir kann das sein, dass ein Skalar ein Array ist ?!?
Tut mir echt leid ich blick da nicht durch und ohne eure Hilfe,
werd ich auch nur sehr schwer weiterkommen ...
cu
Axeman
Hoi,
Ich hab mir jetzt nochmal die Perldoc durchgelesen und da
steht was mit anonymen Listen und so.
Ja.
Was sind denn die
$var = [1, 2, 3, 4];
In $var steckt jetzt eine Referenz auf eine anonyme Liste. Anonym
deshalb, weil es keine Variable gibt, die wirklich den Inhalt
enthaelt, auf den diese Referenz zeigt.
und vor allem wir kann das sein, dass ein Skalar ein Array ist ?!?
Wer hat das gesagt? Wo steht das?
Gruesse,
CK
Hi
$var = [1, 2, 3, 4];
ok das hab ich auch gesehen und da stand auch dran, dass des eine anonyme Liste ist.
Da werfen sich mir ein paar Fragen auf:
1. Wie kann eine Liste ein Skalar sein ?
2. Ist jetzt in $var[0] der Wert 1 drin ?
3. Ich versteh denn Sinn bzw. funktionsweise einer solchen Liste nicht.
Nochmal vielen vielen Dank für Hilfe.
Ich weiss RTFM aber ich komme damit echt nicht weiter.
cu
Axeman
Hoi,
$var = [1, 2, 3, 4];
ok das hab ich auch gesehen und da stand auch dran, dass des eine
anonyme Liste ist.
Da werfen sich mir ein paar Fragen auf:
- Wie kann eine Liste ein Skalar sein ?
Dem ist ja auch nicht der Fall. $var ist eine *Referenz* auf die Liste,
sie zeigt darauf, so nach dem Motto "Da, da hinten, da ist was, was
dich interessieren koennte."
- Ist jetzt in $var[0] der Wert 1 drin ?
Nein. In $$var[0] oder in $var->[0]. Du musst die Referenz erst
dereferenzieren.
- Ich versteh denn Sinn bzw. funktionsweise einer solchen Liste
nicht.
Wie gesagt: du kannst mit derartigen Konstrukten abstrakte Datentypen
nachbilden. Perl kann z. B. keine mehrdimensionalen Arrays, von Haus
aus (das liegt an der Verwaltung als Liste). Dafuer benutzt man
Referenzen, bzw. anonyme Listen:
@array = ([1,2,3],[1,[2,3]],[1,3,4]);
waere Beispielsweise ein mehrdimensionaler Array.
Nochmal vielen vielen Dank für Hilfe.
Gern.
Ich weiss RTFM aber ich komme damit echt nicht weiter.
Hier wird sicher keiner gefressen.
Gruesse,
CK
HI
$var = [1, 2, 3, 4];
- Wie kann eine Liste ein Skalar sein ?
Dem ist ja auch nicht der Fall. $var ist eine *Referenz* auf die Liste,
sie zeigt darauf, so nach dem Motto "Da, da hinten, da ist was, was
dich interessieren koennte."
Aber in dem Fall ist doch da hinten garnix.
Es gibt ja kein:
@x = (1,2,3,4);
$var = /@x;
Ich dachte in $var steht nur eine Adresse Z.b. 0x4451 drin, aber wo stehen in
dem Fall die Werte 1,2,3,4?!?
- Ich versteh denn Sinn bzw. funktionsweise einer solchen Liste
nicht.
Wie gesagt: du kannst mit derartigen Konstrukten abstrakte Datentypen
nachbilden. Perl kann z. B. keine mehrdimensionalen Arrays, von Haus
aus (das liegt an der Verwaltung als Liste). Dafuer benutzt man
Referenzen, bzw. anonyme Listen:
@array = ([1,2,3],[1,[2,3]],[1,3,4]);
waere Beispielsweise ein mehrdimensionaler Array.
Hmm um das zu verstehen müsste ich die erste Fragte wissen, denn
mehrdimensionale Arrays hab ich so gelesen.
@a = (1,2,3);
@b = (3,4,5);
@allarray = (@a, @b);
Und dann kann man das mit 2 foreachschleifen auslesen.
Ist das in deinem Beispiel jetzt auch eine REferenz oder ?
Und wieder mit anonymen Listen.
Uiuiui der Nebel wird zwar klarer aber ist dennoch sehr stark :o)
cu
Axeman
Hoi,
$var = [1, 2, 3, 4];
- Wie kann eine Liste ein Skalar sein ?
Dem ist ja auch nicht der Fall. $var ist eine *Referenz* auf
die Liste, sie zeigt darauf, so nach dem Motto "Da, da hinten,
da ist was, was dich interessieren koennte."
Aber in dem Fall ist doch da hinten garnix.
Klar ist da was.
Es gibt ja kein:
@x = (1,2,3,4);
$var = /@x;
Du meinst '$var = @x;'
Deshalb ist es ja auch eine anonyme Liste. Sie zeigt nicht auf eine
real existierende Variable, sondern auf eine Speicherstruktur.
Ich dachte in $var steht nur eine Adresse Z.b. 0x4451 drin,
Ja.
aber wo stehen in dem Fall die Werte 1,2,3,4?!?
Im Speicher. Variablen sind auch nichts anderes als 'implizite'
Zeiger auf Strukturen, die in den Speicher gepresst wurden. Du merkst
davon zwar nicht viel (deshalb ja auch 'implizite Zeiger'), aber es
ist so; Referenzen sind (in Perl) explizite Zeiger auf derartige
Strukturen. Du musst sie von Hand dereferenzieren.
Hmm um das zu verstehen müsste ich die erste Fragte wissen, denn
mehrdimensionale Arrays hab ich so gelesen.
@a = (1,2,3);
@b = (3,4,5);
@allarray = (@a, @b);
Das ist auch eine Liste von Referenzen auf Listen.
Ist das in deinem Beispiel jetzt auch eine REferenz oder ?
Ja.
Und wieder mit anonymen Listen.
Ja.
Gruesse,
CK