交换哈希值而不使用临时变量

时间:2016-07-08 17:37:14

标签: perl

我在数据结构中有两个深度值,我想要交换,然后稍后再切换回来。

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

由于它们是如此长的名称,($a, $b) = ($b, $a)对于单行代码来说太长了。

有没有办法优雅地做到这一点,或者我是否因为与临时变量交换而陷入三条线路?

3 个答案:

答案 0 :(得分:3)

隐藏“无关”数据意义的人并没有对任何人有任何好处。我们仍然需要编写一个解决方案,但它必须是抽象的术语,对你或我来说都毫无意义!

我能想到的最好方法是使用一对哈希切片

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

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

答案 1 :(得分:1)

创建一个sub,以清楚地表明符号的长行是什么。

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

它也缩短了线条。

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

你甚至可以使用

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

答案 2 :(得分: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} );

现在这个新变量可能不值得只是为了切换,但是如果你在同一个代码块中使用该哈希做得更多,它可能会变得有吸引力