我在数据结构中有两个深度值,我想要交换,然后稍后再切换回来。
$hashref->{$irrelevant}{$key1}
和$hashref->{$irrelevant}{$key2}
由于它们是如此长的名称,($a, $b) = ($b, $a)
对于单行代码来说太长了。
有没有办法优雅地做到这一点,或者我是否因为与临时变量交换而陷入三条线路?
答案 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} );
现在这个新变量可能不值得只是为了切换,但是如果你在同一个代码块中使用该哈希做得更多,它可能会变得有吸引力