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

GwenDragon
 2017-03-31 11:53
#186300 #186300
User since
2005-01-17
14747 Artikel
Admin1
[Homepage]
user image
Du meinst dereferenzieren?

Eine Referenz ist erst mal ein Skalar auf ein Array, einen Hash, ein Objekt, eine sub, etc.

my %hash = (test => 123, foo => 42, bar => 13);

### das Voranstellen des \ erzeugt eine Referenz
my $hash_ref = \%hash; # jetzt hat $hash_ref die Referenz auf den Hash %hash

### eine Referenz lässt sich auch direct bei bestimmten Perl-Objekten erzeugen

# Das Klammern einer Liste zwischen [ ] erzeugt eine Array-Referenz
my $array_ref = [ 1, 2, 4, 8, 16, 32, 64];

# Das Klammern einer Liste zwischen {} erzeugt eine Hash-Referenz
my $hash_ref = { eins => 1, zwei => 2, drei => 4 };

# Dereferenzieren in einen Hash
my %the_hash = %$hash_ref;


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
33
34
35
36
37
38
39
#!/usr/bin/perl

use strict;
use warnings;

use 5.010;

use utf8;

#### in einer Subroutine derefernzieren ####
#

## Wir bauen uns ein Toast-Brot nach eigenen Wünschen
#
# sub Toast_mit ($brotart, $anzahl_der_scheiben, $referenz_auf_reihenfolge_des_belags, $referenz_auf_belaege)
#

sub Toast_mit {
  my $was = shift;             # Art des Brotes
  my $wieviel = shift;         # Menge der Brotscheiben
  my $reihenfolge_ref = shift; # Referenz auf Array mit den Belägen
  my $belag_ref = shift;       # Referenz auf Hash mit Belag und Menge des Belags

  say "Du möchtest $wieviel × $was";
  say "  mit folgenden Belägen:";

  for my $belag ( @{$reihenfolge_ref} ) { # Referenz auf einen Array wird durch Voranstellen von @ in ein Array dereferenziert
     say  "  ", 
          $belag, 
          ": ",
          $belag_ref->{$belag};   # Referenz auf einen Wert in einem Hash wird durch nachfolgendes -> dereferenziert
        # ${$belag_ref}{$belag};  # oder durch vorangestellten $
  }  
}

my %belaege = ( Butter => "4 Stück", Salami => "2 Scheiben", Petersilie => "4 Blätter", Senf => "100 g", Tomate => "1 Scheibe");
my @reihenfolge = qw(Butter Salami Tomate Senf Petersilie);

Toast_mit("Roggenbrot", 3, \@reihenfolge, \%belaege);


Ergibt:
Du möchtest 3 × Roggenbrot
mit folgenden Belägen:
Butter: 4 Stück
Salami: 2 Scheiben
Tomate: 1 Scheibe
Senf: 100 g
Petersilie: 4 Blätter




PS: Ich bin eine schlechte Erklärdrachin, fürchte ich.
Last edited: 2017-03-31 12:02:02 +0200 (CEST)

View full thread Hash in Subroutinen