Schrift
[thread]11630[/thread]

Allg. Frage zu Referenzen (Seite 2)

Leser: 3


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Gast Gast
 2008-04-13 23:10
#108322 #108322
sid burn+2008-04-12 17:45:20--

GwenDragon zeigt ein gutes Beispiel, aber irgendwie fehlt die Erklärung...

Sorry, aber ich bin nicht immer so eine gute Perl-Nachhilfelehrerin wie du.
sid burn
 2008-04-14 15:16
#108359 #108359
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Gast+2008-04-13 21:10:04--
sid burn+2008-04-12 17:45:20--

GwenDragon zeigt ein gutes Beispiel, aber irgendwie fehlt die Erklärung...

Sorry, aber ich bin nicht immer so eine gute Perl-Nachhilfelehrerin wie du.

Kein Problem, dir sei verziehen.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
DanielH
 2008-04-14 21:40
#108383 #108383
User since
2007-11-15
54 Artikel
BenutzerIn
[default_avatar]
wow, super Erklärung sid burn (schonmal drüber nachgedacht ein Buch/Tutorial über Perl zu schreiben? Wär' bestimmt super ;)


Eine Frage zu Refferenzen hätt' ich noch:

Nehmen wir mal an ich habe eine config/input file, in der eine hash-Referenz (mit sehr tiefer Datenstruktur und großen Datenmengen) steht, welche ich per 'my $inputhash = do $file' einlese.

Auf die Daten greif ich jetzt 10.000.000 mal zu (nur als Beispiel ;). Was wäre besser:

* ich verwende die hash-Referenz, wie sie ist und dereferenziere 10.000.000 mal oder

* ich dereferenziere den Hash einmal und speicher' alle Werte in entsprechenden Variablen ab, um dann die Variablen zu verwenden (ohne dereferenzieren)

bei der Datenmenge der einzelnen Werte handelt es sich nicht um MB-große Sachen, sondern eher um viele kleine Strings.


Meine eigentliche Frage ist also, ob Dereferenzierung (übermäßigen) overhead erzeugt oder ob ich das Thema vernachlässigen kann (wenn z. B. 100.000 mal auf die Daten zugegriffen wird).


Wenn ich den overhead vernachlässigen kann, könnte ich mir nämlich sowas ersparen: @{$inputHash->{config}->{group_1}->{Option}} ;)
nepos
 2008-04-14 22:14
#108385 #108385
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Bei sehr vielen Zugriffen kostet das andauernde Dereferenzieren schon Zeit.
Du kannst dir ja mal das praktische Modul CPAN:Benchmark ansehen. Damit kannst recht einfach diverse Arten vergleichen.
sid burn
 2008-04-15 13:52
#108404 #108404
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Quote
wow, super Erklärung sid burn (schonmal drüber nachgedacht ein Buch/Tutorial über Perl zu schreiben? Wär' bestimmt super ;)

Ja,
das ist mein Projekt das ich schon länger im Kopf habe. ;) Muss nur erstmal anfangen meine HP aufzubauen. Danach fange ich das an. Nur fehlt mir irgendwie noch die Zeit und mache noch ne menge andere Dinge nebenbei. Werde aber dieses jahr noch was in der Richtung auf die Beine stellen.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Tr0Nix
 2008-04-15 18:15
#108417 #108417
User since
2006-11-21
44 Artikel
BenutzerIn
[default_avatar]
Hallo Sid (& Rest)

Erstmal: super Beitrag!

Kleine Frage:
Was passiert, wenn ich ein anonymes Hash zurückgebe in einer Subfunktion?

Also um dein letztes Beispiel zu nehmen, statt dem hier:
Code: (dl )
1
2
3
4
5
6
7
8
my %person = (
vorname => $vorname,
name => $name,
geburtstag => $geburtstag,
wohnort => $wohnort,
);

return \%person;


Das hier:
Code: (dl )
1
2
3
4
5
6
return (
vorname => $vorname,
name => $name,
geburtstag => $geburtstag,
wohnort => $wohnort,
);


.. und diesen Rückgabewert beispielsweise an einer neuen Funktion füttere:
Code: (dl )
schreibe_an(ask_person());

.. und DORT dann als Referenz behandle.

Code: (dl )
1
2
3
4
sub schreibe_an {
my $dummy = shift;
return \$dummy;
}


Muss man da aufpassen wenn man mischt?
lichtkind
 2008-04-15 18:35
#108418 #108418
User since
2004-03-22
5730 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
sid burn: was genau willst du aufbauen?
mein zeug:, Leute

Es beginnt immer mit einer Entscheidung.
murphy
 2008-04-15 19:05
#108419 #108419
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Tr0Nix+2008-04-15 16:15:32--
[...]
Was passiert, wenn ich ein anonymes Hash zurückgebe in einer Subfunktion?

Also um dein letztes Beispiel zu nehmen, statt dem hier:
Code: (dl )
my %person = ( [...] ); return \%person;


Das hier:
Code: (dl )
return ( [...] );


Zweiteres ist kein Ersatz für Ersteres! Im zweiten Fall wird nämlich kein anonymer Hash zurückgegeben, sondern einfach eine Liste von abwechselnden Schlüsseln und Werten.

Quote
.. und diesen Rückgabewert beispielsweise an einer neuen Funktion füttere:
Code: (dl )
schreibe_an(ask_person());


ask_person gibt nun eine Liste zurück, folglich werden alle Werte dieser Liste als Parameter an schreibe_an übergeben.

Quote
.. und DORT dann als Referenz behandle.

Code: (dl )
1
2
3
4
sub schreibe_an {
my $dummy = shift;
return \$dummy;
}


schreibe_an holt sich den ersten Parameter, was in Deinem Beispiel einfach der erste Schlüssel ist, den ask_person geliefert hat, und gibt eine Referenz auf diesen Skalar zurück.

Quote
Muss man da aufpassen wenn man mischt?


Ja, weil man nicht wirklich mischen kann. Parameter und Rückgabewerte von Subroutinen sind immer Listen von Skalaren, niemals Arrays oder Hashes sondern höchstens Referenzen darauf.

Du könntest Dein Beispiel aber so verändern, dass in ask_person tatsächlich ein anonymer Hash zurückgegeben wird (return { [...] }; statt return ( [...] );) und in schreibe_an dann nicht noch einmal eine Referenz auf die Referenz erzeugen. Oder Du könntest erst in schreibe_an den Hash erzeugen (my %dummy = @_; return \%dummy; statt my $dummy = shift; return \$dummy;).
When C++ is your hammer, every problem looks like your thumb.
Tr0Nix
 2008-04-16 11:01
#108436 #108436
User since
2006-11-21
44 Artikel
BenutzerIn
[default_avatar]
Hm, danke für deine Erläuterung. Was ich oben geschrieben habe, habe ich in einer solchen Form zum laufen gekriegt - lustigerweise ist mir dann aber teilweise der Perl Interpreter von Komodo gecrashed und konnte teil Variablen nicht sauber zugreifen, obwohl sie im Debugger angezeigt wurden..

Ich hab jetzt alles mal gemäss Sid-Burns Beispiel angepasst und nun crashed mein Komodo nicht mehr *smile*.
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2008-04-12 17:15.