Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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_Hash - Fatal编程技术网

绑定Perl哈希键

绑定Perl哈希键,perl,hash,Perl,Hash,可以强制不同的perl哈希键映射到相同的值吗?例如: my %h = ( aaa => 'val_1', bbb => 'val_2', ); print "==============\n"; &dump(); $h{bbb} = \$h{aaa}; &dump(); $h{aaa} = 'new'; &dump(); sub dump{ foreach my $k ( sort keys %h ){ pri

可以强制不同的perl哈希键映射到相同的值吗?例如:

my %h = (
   aaa => 'val_1',
   bbb => 'val_2',
);
print "==============\n";
&dump();

$h{bbb} = \$h{aaa};    
&dump();

$h{aaa} = 'new';    
&dump();

sub dump{
    foreach my $k ( sort keys %h ){
    print "$k => $h{$k}\n";
    }
    print "==============\n";
}
这将打印:

==============
aaa => val_1
bbb => val_2
==============
aaa => val_1
bbb => SCALAR(0x801d48)
==============
aaa => new
bbb => SCALAR(0x801d48)
但我想要的是:

==============
aaa => val_1
bbb => val_2
==============
aaa => val_1
bbb => val_1
==============
aaa => new
bbb => new

您可以使用
tie
创建一个哈希实现,当您检索值时,该实现将自动取消引用。

您可以存储对值的引用,而不是值(如图所示)。这是“干净”的方法

正如clintp所建议的,不太干净的方法是使用绑定哈希

非常不干净的方法是别名:

use Data::Alias;
...
alias $h{bbb} = $h{aaa};
请注意,这涉及到处理perl的内部结构,如果Data::Alias未被维护,而较新的perl版本破坏了它,则会有一定程度的风险

#!\usr\bin\perl 
use strict;
use warnings;

my %h = (
   aaa => 'val_1',
   bbb => 'val_2',
);
print "==============\n";
&dump();

$h{bbb} = $h{aaa};    
&dump();

$h{aaa} = 'new';    
$h{bbb} = $h{aaa};
&dump();

sub dump{
    foreach my $k ( sort keys %h ){
    print "$k => $h{$k}\n";
    }
    print "==============\n";
}
输出为:

==============
aaa => val_1
bbb => val_2
==============
aaa => val_1
bbb => val_1
==============
aaa => new
bbb => new

或者,您可以这样做,以获得您想要的输出:

#!\usr\bin\perl 
use strict;
use warnings;
my %h = (aaa => 'val_1', bbb => 'val_2');
print "==============\n";
&dump();
my $ha = \$h{aaa}; 
$h{bbb} = $$ha;
&dump();
$$ha = 'new'; 
$h{bbb} = $$ha;   
&dump();
sub dump
{
 foreach my $k (sort keys %h)
 {
  print "$k => $h{$k}\n";
 }
 print "==============\n";
}

问题是,你为什么要这样做。最有可能的情况是,您正在尝试用另一种方式解决一些更好的问题。也就是说,这是一个。这不完全符合我的要求
$h{bbb}
将被初始化为正确的值,但我需要它在
$h{aaa}
更改时进行更新。@ajwood:我已经编辑了我的代码。现在我得到了你想要的结果。对,但我认为你没有抓住我问题的要点。我想绑定一次散列的密钥,以后就不需要知道绑定了;如果一个值更改,另一个值也应自动更改