0

異なる 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
4

4 に答える 4

2

値の代わりに値への参照を保存できます (示すように)。それが「クリーン」な方法です。

clintp が示唆するように、あまりクリーンでない方法は、結合されたハッシュを使用することです。

非常にきれいではない方法は、エイリアスを使用することです。

use Data::Alias;
...
alias $h{bbb} = $h{aaa};

これには perl の内部をいじる必要があることに注意してください。これには、Data::Alias がメンテナンスされなくなり、新しい perl バージョンが壊れた場合に、ある程度のリスクがあります。

于 2013-01-15T17:13:36.077 に答える
0

または、この方法で、必要な出力が得られます。

#!\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";
}
于 2013-01-31T05:24:56.373 に答える
0

を使用tieして、値を取得するときに自動逆参照を行うハッシュ実装を作成できます。

于 2013-01-15T16:39:03.060 に答える
0
#!\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
于 2013-01-30T06:53:19.637 に答える