Thread Syntax Zugriff Array Index (23 answers)
Opened by bianca at 2019-08-11 08:23

haj
 2019-08-11 12:15
#190357 #190357
User since
2015-01-07
551 articles
BenutzerIn

user image
2019-08-11T07:16:00 bianca
2019-08-11T06:33:54 rosti
assoziative Datenstruktur

Wie sähe die für dieses Beispiel aus?

Es lohnt sich für solche Fälle in jedem Fall, sich mit der Funktion Perldoc:perlfunc map vertraut zu machen, die FIFO ins Rennen gebracht hat. Mit der kann man sowohl Hashes als auch Arrays ohne mehrzeilige Schleife in einem Rutsch verarbeiten:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;
use warnings;
my @stats = (['RequestsA',0],['RequestsB',0],['RequestsC',0],['RequestsD',0],['RequestsE',0]);

# Direkt als assoziative Datenstruktur (in Perl ein "Hash")
my %stats = ( RequestsA => 0, RequestsB => 0, RequestsC => 0, RequestsD => 0, RequestsE => 0);

# Konversionen zwischen den beiden
%stats = map { @$_ } @stats;
@stats = map { [ $_, $stats{$_} ] } keys %stats; # !! siehe unten

# Initialisieren des Hash in einem Aufwasch (alle Elemente auf 0)
%stats = map { $_ => 0 } (qw(RequestsA RequestsB RequestsC RequestsD RequestsE));

# und dann anstelle der $idx-Methode einfach nur:
$stats{RequestsD}++;

Drei Dinge muss man bei assoziativen Datenstrukturen beachten:
  • Der Schlüssel (also der 'linke' Teil) wird von Perl in einen String konvertiert, kann also keine Referenz sein. Darin steckt auch die Magie des =>: Das ist "wie ein Komma", aber ein einfacher String (keine Leer- oder Satzzeichen etc.) links davon kann ohne Anführungszeichen geschrieben werden.
  • Es gibt nur einen Wert für einen Schlüssel. Wenn RequestsA zweimal in der Liste auftaucht, geht im Hash einer davon verloren.
  • Die Reihenfolge der Schlüssel/Wert-Paare ist nicht definiert. Nach der Konversion des Array in einen Hash und zurück hast Du eine andere Reihenfolge als vorher.

View full thread Syntax Zugriff Array Index