Thread mehrere hashes übergeben an Sub (8 answers)
Opened by chmod777 at 2021-01-05 06:53

GwenDragon
 2021-01-05 09:50
#193078 #193078
User since
2005-01-17
14741 articles
Admin1
[Homepage]
user image
Du musst das dereferenzieren, also die Referenzen auflösen.
Das geht in Perl so:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
my $arr_ref = [ 1, 2, 4, 8, 16 ];
say $$arr_ref[2]; # ergibt 4
say $arr_ref->[2]; # dasselbe anders geschrieben, ergibt auch 4


my $h_ref = {
   Koordinaten => { Laenge => 13.4711, Breite => -42.0815},
   Ortsnamen => [ 'boodorf', 'Boohtan', 'Boost' ]
};
say $h_ref->{Ortsnamen}->[0]; # ergibt boodorf
say $$h_ref{Ortsnamen}[0];    # ergibt boodorf


Ich weiß, das kann in Perl extrem grausig aussehen, als Verschachtelung von Sigillen (also die $%& am Anfang der Variablenamen) und geschweiften Klammern (zwecks besserer Sichtbarkeit später für sich selbst und andere).

Ein weiteres Beispiel:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use utf8;

my %adresse = (
        Name => 'Bkah',
        Strasse => 'Morgula Av. 11-B',
        Land => 'Perlistan'
);
my %beleg_art = (
        Art => 'Rechnung'
);

my $href = {
        beleg_art => \%beleg_art,
        adresse   => \%adresse, 
};

my $pdf_file = create_pdf_v3($href);

sub create_pdf_v3 {
  my $href = shift;

  my %belege_hash   = %{ $href->{beleg_art} };
  my %adressen_hash = %{ $href->{adresse}   }; 
  
  print "Der Kunde ist ", $adressen_hash{Name};
  print " mit ", $belege_hash{Art};  
}


Ergibt:
Der Kunde ist Bkah mit Rechnung


Neue Perl haben auch eine experimentelle Syntax, welche die Lesbarkeit verbessert.
Muss aber meist aktiviert werden mit use feature "postderef"; oder use v5.20;. Um im Produktionscode nicht zu stören, sind entsprechende Warnungen mit no warnings "experimental::postderef"; zu unterdrücken.

Statt
my %belege_hash   = %{ $href->{beleg_art} };
geht dann auch
my %belege_hash   = $href->{beleg_art}->%*;
Welches du als lesbarer empfindest, musst du wissen.



Weiteres zu Dereferenzierung (alte und neue Art der D.):
https://www.heise.de/developer/artikel/Syntaktisch...
https://perldoc.perl.org/perlref#Using-References
https://perldoc.perl.org/perlref#Postfix-Dereferen...
https://perlmaven.com/dereference-hash-array
https://www.effectiveperlprogramming.com/2016/04/p...
https://www.effectiveperlprogramming.com/2014/09/u...
http://www.mathe2.uni-bayreuth.de/perl/EP/referenz...
Last edited: 2021-01-05 10:53:15 +0100 (CET)

View full thread mehrere hashes übergeben an Sub