绑定Perl哈希键
可以强制不同的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
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:我已经编辑了我的代码。现在我得到了你想要的结果。对,但我认为你没有抓住我问题的要点。我想绑定一次散列的密钥,以后就不需要知道绑定了;如果一个值更改,另一个值也应自动更改