2016-07-08 8 views
0

私は交換したいデータ構造の2つのハッシュ値を2つの深さに持っています。一時的な変数を持たないExchangeハッシュ値

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

彼らは、このような長い名前なので、($a, $b) = ($b, $a)は、単一のコード行のためにあまりにも長くなります。

これをうまくやり遂げる方法はありますか、または一時変数と交換して3つの行を使いこなしていますか?

+0

を使用することができます! (あなたが聞いていなくても、彼らは拒否します) – Borodin

+0

heh。私はちょうどそれが "私がまだ聞いたことがない比較的一般的なperl-ism"の略語として使っていました。私はあまりにも賢いコードを書くという問題を認識しています。 – fexam

+0

ええ、私はそれをかなり理解していました。私はそれがあなたが意図したとおりに読むことができないかもしれないことを警告しています! – Borodin

答えて

3

"無関係な"データの意味を隠す人は、誰にも好意を与えていません。私たちはまだ解決策を書く必要がありますが、抽象的な言葉であなたや私のどちらにも意味をなさない必要があります!

私は考えることができるneatest方法は、ハッシュスライスのペア

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

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

スライス。ニースの解決策。 – tjd

0

レキシカルな一時変数を宣言するコードには、はるかに深刻な罪がありますが、あなたが私にあなたにアイデアを投げかけようとしているからです。

$hashref->{$irrelevant}で重要な作業を行う場合は、メンテナンスプログラマー&のコードを簡潔にして、使用ごとにレベルを切り捨てるようにしてください。例えば

# 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}); 

今、この新しい変数は、スイッチのためにおそらくちょうどそれ価値はありませんが、同じコードブロックではるかにそのハッシュとをやっているよ場合、それは単に魅力的になるかもしれません。

1

であるシンボルのフル長い行が何をしているのか、それを明確にするサブを作成します。

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

また、行が短くなります。

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

あなたも、私はあなたが「賢い」方法を尋ねていないことを示唆している、またはあなたが意地の悪のすべての種類に自分自身を開く

swap(@{ $hashref->{$irrelevant} }{ $key1, $key2 }); 
関連する問題