Schrift
[thread]8018[/thread]

funktion und referenz (Seite 2)

Leser: 1


<< |< 1 2 >| >> 16 Einträge, 2 Seiten
renee
 2006-05-25 12:53
#66583 #66583
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dann musst Du auch my %hash2 schreiben.

Das Sigil % zeigt, dass es ein Hash ist, das Sigil $ ein Skalar.

Bei my $hash2 = %{shift} versuchst Du ein Hash in einen Skalar zu pressen.

Bei my $hash2 = shift; wird dem Skalar $hash2 das erste Element der Parameterliste zugewiesen (in diesem Fall eine Hashreferenz).
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
shaihulud
 2006-05-25 13:08
#66584 #66584
User since
2006-04-12
76 Artikel
BenutzerIn
[default_avatar]
ah oki, verstehe.. ich glaub endlich hab ich mal den krams mit den referenzen hier geblickt.. Bin im buch noch nicht soweit (Programmieren mit Perl(bisher übrigens weiter zu empfehlen..)).

hab die änderungen alle vorgenommen und nun funktioniert das soweit, aber was ich nicht weiss ist wie ich nen hash wieder leere.. also bei meiner
if($dokuart ne $old_doc){
${$hash2}{$old_doc}=\%hash;
%hash={};
}
abfrage will ich den hash wieder leeren, das scheint aber so nicht zu gehn.wie kann ich sagen dass ich den hash wieder leeren will um ihn dann mit neuen elementen zu füllen?
Dubu
 2006-05-25 13:38
#66585 #66585
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Du kannst den Hash so leeren:
Code: (dl )
%hash = ();

aber das wird evtl. dein Problem nicht lösen, denn ich nehme an, du möchtest dabei nicht gleichzeitig den Inhalt von $hash2->{$old_doc} auch löschen.

$hash2->{$old_doc} enthält aber keine Kopie von %hash, sondern eine Referenz auf %hash, d.h. alle Änderungen an %hash ändern auch $hash2->{$old_doc}.

Es gibt zwei Möglichkeiten, das zu umgehen: Erstens kann man den Hash bei der Zuweisung einfach kopieren. Das geht so:
Code: (dl )
$hash2->{$old_doc}={ %hash };

Hier wird rechts durch die geschwungenen Klammern eine Referenz auf einen anonymen Hash geschaffen, der mit dem Inhalt von %hash gefüllt wird.

Die zweite Möglichkeit ist, %hash nur in einem kleinen Scope zu deklarieren, sodass er automatisch jedesmal neu angelegt wird. Das benutzt man oft mit Schleifen:
Code: (dl )
1
2
3
4
5
6
for (...) {
   my %hash;
   # fülle %hash mit Daten
   # ...
   $grosse_datenstruktur{$foo}{$bar} = \%hash;
}

Dadurch, dass %hash in der Schleife deklariert ist, wird er bei jedem Schleifendurchgang neu angelegt. Weil der "alte" Inhalt aber irgendwo in $grosse_datenstruktur noch referenziert wird, wird er nicht freigegeben.

Statt einer Schleife kann hier genauso eine Subroutine stehen, die lokal %hash deklariert und die Referenz irgendeiner anderen Datenstruktur zuweist.
bloonix
 2006-05-25 15:32
#66586 #66586
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=shaihulud,25.05.2006, 10:27]my $hash2 = %{shift};[/quote]
Hallo shaihulud,

letzte Woche erst habe ich mir den Abschnitt Kontext durchgelesen
und kann ihn nur weiterempfehlen, um ein klares Verständnis für
Operationen zu erhalten.

Falls du die Perlbibel nicht hast, dann hier ein paar Schlagwörter:

Skalarer- und Listenkontext
Boolescher Kontext
Void Kontext
Interpolativer Kontext

Viele Grüße,
opi

Edit:
ich muss zugeben, dass ich das Kapitel 4 Mal lesen musste, bis ich alles
richtig verstanden habe, vorallem die Geschichte mit dem verkappten
Kommaoperator :)\n\n

<!--EDIT|opi|1148557149-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
shaihulud
 2006-05-26 14:34
#66587 #66587
User since
2006-04-12
76 Artikel
BenutzerIn
[default_avatar]
danke dubu. ich habs mit der kopie auf die referenz gemacht und es funktioniert! :)
ich würd mir echt gern die zeit nehmen mich mit all dem mehr auseinander zu setzen(wie gesagt larry walls buch hab ich schon gekauft)... vielleicht finde ich in den kommenden semesterferien zwischen den prüfungen zeit... in der zwischenzeit bedanke ich mich für die hilfe bei solchen problemen!

(find übrigens dass dies das beste forum ist in dem ich je gepostet hab!)
shaihulud
 2006-05-26 14:36
#66588 #66588
User since
2006-04-12
76 Artikel
BenutzerIn
[default_avatar]
@ opi, welche bibel meinst du? ich hab wie gesagt nur "Programmieren mit Perl"..
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2006-05-24 18:26.