Perl 不使用临时变量交换哈希值
我有两个哈希值,在一个数据结构中有几个层次,我想交换它们,然后再切换回来Perl 不使用临时变量交换哈希值,perl,Perl,我有两个哈希值,在一个数据结构中有几个层次,我想交换它们,然后再切换回来 $hashref->{$unrelated}{$key1}和$hashref->{$unrelated}{$key2} 由于它们是如此长的名称,($a,$b)=($b,$a)对于一行代码来说太长了 有没有一种方法可以优雅地做到这一点,或者我被困在用一个临时变量交换三行代码的过程中?在编码声明一个词汇临时变量的过程中,有很多严重的错误,但是既然你问起了,让我给你一个想法 如果您要使用$hashref->{$unrelated
$hashref->{$unrelated}{$key1}
和$hashref->{$unrelated}{$key2}
由于它们是如此长的名称,($a,$b)=($b,$a)
对于一行代码来说太长了
有没有一种方法可以优雅地做到这一点,或者我被困在用一个临时变量交换三行代码的过程中?在编码声明一个词汇临时变量的过程中,有很多严重的错误,但是既然你问起了,让我给你一个想法 如果您要使用
$hashref->{$unrelated}
进行任何有意义的工作,也许您应该特别地获取一份副本,以使您的代码对维护程序员来说更加简洁,并减少每次使用时的去引用级别
例如:
# 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} );
现在,仅仅为了切换,这个新变量可能不值得,但如果您在同一个代码块中对该散列做更多的处理,它可能会变得很有吸引力。在编写声明词法临时变量的代码时,有更多严重的错误,但既然您提出了要求,让我向您提出一个想法 如果您要使用
$hashref->{$unrelated}
进行任何有意义的工作,也许您应该特别地获取一份副本,以使您的代码对维护程序员来说更加简洁,并减少每次使用时的去引用级别
例如:
# 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} );
现在,仅仅为了切换,这个新变量可能不值得使用,但如果您在同一代码块中使用该散列做更多的事情,它可能会变得很有吸引力。隐藏“不相关”数据含义的人不会帮任何人的忙。我们仍然需要写一个解决方案,但它必须是抽象的,对你我都没有意义
我能想到的最整洁的方法是用一对散列切片
my $irrelevant_href = $hashref->{$irrelevant};
@{$irrelevant_href}{$key1, $key2} = @{$irrelevant_href}{$key2, $key1};
你们这些隐藏“不相关”数据含义的人并没有帮任何人的忙。我们仍然需要写一个解决方案,但它必须是抽象的,对你我都没有意义
我能想到的最整洁的方法是用一对散列切片
my $irrelevant_href = $hashref->{$irrelevant};
@{$irrelevant_href}{$key1, $key2} = @{$irrelevant_href}{$key2, $key1};
创建一个子元素,以明确充满符号的长线在做什么
sub swap { ($_[0], $_[1]) = ($_[1], $_[0]) }
而且它也使线路更短
swap($hashref->{$irrelevant}{$key1}, $hashref->{$irrelevant}{$key2});
你甚至可以使用
swap(@{ $hashref->{$irrelevant} }{ $key1, $key2 });
创建一个子元素,以明确充满符号的长线在做什么
sub swap { ($_[0], $_[1]) = ($_[1], $_[0]) }
而且它也使线路更短
swap($hashref->{$irrelevant}{$key1}, $hashref->{$irrelevant}{$key2});
你甚至可以使用
swap(@{ $hashref->{$irrelevant} }{ $key1, $key2 });
片。很好的解决方案。很好的解决办法。我建议你不要要求“聪明”的方法,否则你会让自己暴露在各种各样的肮脏面前!(并不是说即使你不问,他们也会退缩)嘿。我只是用它作为“一个相对常见的perl ism,我还没有听说过”的简写。我知道写太聪明的代码的问题。是的,我非常理解这一点。我只是警告你,这可能不是你想要的!我建议你不要要求“聪明”的方法,否则你会让自己暴露于各种各样的肮脏之中!(并不是说即使你不问,他们也会退缩)嘿。我只是用它作为“一个相对常见的perl ism,我还没有听说过”的简写。我知道写太聪明的代码的问题。是的,我非常理解这一点。我只是警告你,这可能不是你想要的!