Thread Hash in Subroutinen (12 answers)
Opened by Andi123 at 2017-03-30 18:58

Linuxer
 2017-03-30 19:41
#186294 #186294
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
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!

View full thread Hash in Subroutinen