Wo ich gerade im anderen Thread zum Thema Referenz / Kopie / Clone so viel mit Strukturen herumgemacht habe, kam mir die Frage, wie man eigentlich bei einem Hash wohl am elegantesten ein Element (einen Schlüssel) umbenennt.
Beim Array kann man dessen "Elemente" (das sind aber die Werte, den Schlüsseln entsprechen eigentlich die Indizes der Elemente) so umbenennen:
my @a1 = (qw/a b c d/);
print 'a1 : ', Dumper \@a1;
for (@a1) {
$_ = 'aa' if $_ eq 'a';
}
print 'a1 : ', Dumper \@a1;
(Oder per
$a1[0] = 'aa'; falls man den Index kennt.)
Das genaue Analogon für Hashes geht so (um Werte umzubennennen):
my %h1 = (qw/a 1 b 2 c 3 d 4/);
print 'h1 : ', Dumper \%h1;
for (keys %h1) {
$h1{$_} = '44' if $h1{$_} eq '4';
}
print 'h1 : ', Dumper \%h1;
(Oder per
$h1{d} = '44'; falls man den Schlüssel kennt.)
Was macht man aber, wenn man die Schlüssel des Hashes umbenennen will? Dabei hat man sich natürlich immer mit der Frage herumzuplagen was passieren soll, wenn es den Schlüssel schon gibt. Aber nehmen wir mal an, es gibt ihn nicht (und wir haben einen sinnvollen Grund, den Schlüssel umbenennen zu wollen).
Ich probiere mal vier Methoden aus, zwei ohne und zwei mit Erfolg.
Einfach über das Schlüssel-Array?
for (keys %h1) {
$_ = 'aa' if $_ eq 'a';
}
Nein, so geht es nicht, hätte mich auch überrascht.
Einfach über das Hash als Array?
for (%h1) {
$_ = 'aa' if $_ eq 'a';
}
so gehts auch nicht (wär auch blöd, falls a auch mal als Wert vorkommt).
Indem man einen neuen Schlüssel anlegt und den alten löscht (wahrscheinlich die naheliegendtse und langweiligste Möglichkeit)
$h1{aa} = $h1{a};
delete $h1{a};
so geht es natürlich.
Indem man in ein Array umkopiert und hinterher wieder zurück (igitt)
my @h1 = %h1;
for (@h1) {
$_ = 'bb' if $_ eq 'b';
}
%h1 = @h1;
so geht es natürlich auch.
Die Frage ist, gibt es eine andere (elegantere) Möglichkeit und braucht man das überhaupt?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;
use strict; use warnings; Link zu meiner Perlseite