Thread Hash in Subroutinen
(12 answers)
Opened by Andi123 at 2017-03-30 18:58
Bei einem Aufruf wie foo( %hash ); wird aus dem Hash eine Liste der Schlüssel und Werte gelesen und an die Sub übergeben. In der Sub kannst Du dann die Werte wieder einem Hash zuweisen.
Code (perl): (dl
)
1 2 3 4 5 6 sub foo { my %hash = @_; for my $key ( keys %hash ) { print "$key : ", $hash{$key}, "\n"; } } Da der Inhalt des Hashes zu einer Liste wird, geht der Bezug zum Hash verloren; Wenn Du so zwei Hashes übergeben würdest, kannst Du innerhalb der Subroutine nicht feststellen, wo der erste Hash aufhört und der zweite beginnt. Dann ist es sinnvoller, Referenzen auf die Hashes zu übergeben: foo( \%hash1, \%hash2 ); Diese Referenzen musst Du dann aber in der Subroutine wieder "auflösen", also dereferenzieren. Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 sub foo { my ( $hash1, $hash2 ) = @_; # oder # my $hash1 = shift; # my $hash2 = shift; # damit liegt in $hash1 und $hash2 jeweils eine Referenz auf einen Hash # ersten Hash dereferenzieren, indem ein % vor die Referenz gestellt wird for my $key ( keys %$hash1 ) { # die einzelnen Elemente derefenzieren mit Pfeil-Operator und geschweiften Klammern print "$key : ", $hash1->{$key}, "\n"; } # zweiten Hash dereferenzieren; Kommentare siehe vorige Schleife for my $key ( keys %hash2 ) { print "$key : ", $hash2->{$key}, "\n"; } } edit: Grammatik-Fehler korrigiert edit2: Code-Anmerkungen ergänzt Last edited: 2017-03-31 17:22:00 +0200 (CEST) meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |