2016-07-08 6 views
0

Ich habe zwei Hash-Werte ein paar Ebenen tief in einer Datenstruktur, die ich gerne austauschen und dann später zurück wechseln würde.Exchange Hash-Werte ohne temporäre Variable

$hashref->{$irrelevant}{$key1} und $hashref->{$irrelevant}{$key2}

Da sie so lange Namen sind, ($a, $b) = ($b, $a) würden für eine einzige Zeile Code Art und Weise zu lang sein.

Gibt es eine Möglichkeit, dies elegant zu tun, oder bin ich fest, indem ich drei Zeilen durch den Austausch mit einer temporären Variable einnehme?

+0

verwenden könnte ich vorschlagen, dass Sie für „klug“ Wege nicht fragen, oder Sie öffnen sich für alle Arten von Gemeinheiten! (Nicht dass sie sich zurückhalten würden, selbst wenn du nicht fragst) – Borodin

+0

heh. Ich habe es nur als Abkürzung für "einen relativ gewöhnlichen Perlismus, von dem ich noch nicht gehört habe" verwendet. Ich bin mir des Problems bewusst, Code zu schreiben, der zu schlau ist. – fexam

+0

Ja, das habe ich ziemlich verstanden. Ich warne nur, dass es möglicherweise nicht so gelesen wird, wie Sie es beabsichtigt haben! – Borodin

Antwort

3

Sie Leute, die "irrelevante" Datenbedeutungen verbergen, tun niemandem irgendwelche Bevorzugungen. Wir müssen noch eine Lösung schreiben, aber es muss in abstrakten Begriffen sein, die weder für dich noch für mich einen Sinn ergeben!

Die sauberste Art, wie ich denken kann, ist mit einem Paar von Hash-Scheiben

my $irrelevant_href = $hashref->{$irrelevant}; 

@{$irrelevant_href}{$key1, $key2} = @{$irrelevant_href}{$key2, $key1}; 
+2

Scheiben. Nette Lösung. – tjd

0

Es gibt weitaus schwerwiegendere Sünden im Codieren, die eine lexikalische Temperaturvariable deklarieren, aber da du fragst, lass mich eine Idee auf dich werfen.

Wenn Sie eine wichtige Arbeit mit $hashref->{$irrelevant} tun, sollten Sie vielleicht eine Kopie davon speziell, um sowohl Ihren Code kürzer für einen Wartungsprogrammierer & schneiden Sie eine Ebene der Dereferenzierung bei jeder Verwendung.

Zum Beispiel:

# capture inner reference 'cause we'll be using it alot anyway... 
my $ir_h_ref = $hashref->{$irrelevant}; 

#stuff here 

# Do swap with shorter reference chain 
($ir_h_ref->{$key1}, $ir_h_ref->{$key2}) = 
    ($ir_h_ref->{$key2}, $ir_h_ref->{$key1}); 

Nun ist diese neue Variable ist wahrscheinlich lohnt sich nicht nur zum Wohl des Schalters, aber wenn Sie viel mehr mit diesem Hash werden in dem gleichen Code-Block zu tun Es kann nur attraktiv werden.

1

eine Unter erstellen, um deutlich zu machen, was die lange Linie voller Symbole tut.

sub swap { ($_[0], $_[1]) = ($_[1], $_[0]) } 

Und es macht auch die Linie kürzer.

swap($hashref->{$irrelevant}{$key1}, $hashref->{$irrelevant}{$key2}); 

Sie auch

swap(@{ $hashref->{$irrelevant} }{ $key1, $key2 }); 
Verwandte Themen