Thread Syntaxfrage: push @{ ... (6 answers)
Opened by Netsrot50 at 2010-08-06 09:04

Gast Netsrot50
 2010-08-06 09:04
#140408 #140408
Hallo zusammen,

ich hatte kürzlich mit einem Codesschnipsel zu tun, in dem bei einem Hash die Keys und Values vertauscht wurden. Da einige dieser Values mehrfach vorkamen, wurde das Ziel-Hash so aufgebaut, dass die neuen Values in ein Array geschrieben wurden. Ein Beispiel:

Aus
Code: (dl )
1
2
3
4
5
6
7
8
Hash: viele_biere:
$VAR1 = {
'Schlösser' => 'Alt',
'Krombacher' => 'Pils',
'Diebels' => 'Alt',
'Erdinger' => 'Weizen',
'Veltins' => 'Pils'
};


wurde:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Hash: bierarten:
$VAR1 = {
'Weizen' => [
'Erdinger'
],
'Pils' => [
'Krombacher',
'Veltins'
],
'Alt' => [
'Schlösser',
'Diebels'
]
};


Was bei der Transformation zu tun ist, ist halbwegs klar: für jeden ursprünglichen Value prüfen, ob im neuen Hash schon ein entsprechender Key mit Array existiert: falls ja, dann pushen, ansonsten neu anlegen und pushen.

In der mir vorliegenden Lösung wird diese Logik sehr elegant in einer Zeile abgearbeitet:
Code: (dl )
1
2
3
4
my %bierarten;
for my $ein_bier ( keys %viele_biere ) {
push @{ $bierarten{$viele_biere{$ein_bier}} }, $ein_bier;
}


Und dazu möchte ich nun gerne mal fragen, ob es sich hier um einen spezielle Perl-Syntax handelt (bezogen auf @{..}). Falls ja, gibt es dann irgendwo eine Dokumentation drüber? Die Suche gestaltet sich aufgrund der Sonderzeichen leider schwierig.
Oder lässt sich dieses Vorgehen aus anderen Perl-Syntax-Elementen ableiten?

Vielen Dank!
Last edited: 2010-08-06 09:05:37 +0200 (CEST)

View full thread Syntaxfrage: push @{ ...