Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 不使用临时变量交换哈希值_Perl - Fatal编程技术网

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,我还没有听说过”的简写。我知道写太聪明的代码的问题。是的,我非常理解这一点。我只是警告你,这可能不是你想要的!