如何从现有哈希创建匿名哈希?
对于数组,我使用:
@x = (1, 2, 3); my $y = [@x];
但我找不到如何为哈希做同样的事情:
my %x = (); my $y = ???;
谢谢
为什么需要匿名哈希?虽然答案告诉你各种方法可以制作一个匿名哈希,但我们不知道它们中的任何一个是否是你想要做的任何事情的正确解决方案.
如果您想要一个可以在不打扰原始数据的情况下修改的独特副本,请使用dclone
Perl附带的Storable.它会创建数据结构的深层副本:
use Storable qw(dclone); my $clone = dclone \%hash;
考虑戴夫韦伯的答案,但附加一层参考.key的值c
是另一个哈希引用:
use Data::Dumper; my %original = ( a => 1, b => 2, c => { d => 1 } ); my $copy = { %original }; print "Before change:\n\n", Data::Dumper->Dump( [ \%original], [ qw(*original) ] ), Data::Dumper->Dump( [ $copy ], [ qw(copy) ] ), ; $copy->{c}{d} = 'foo'; print "\n\nAfter change:\n\n", Data::Dumper->Dump( [ \%original], [ qw(*original) ] ), Data::Dumper->Dump( [ $copy ], [ qw(copy) ] ), ;
通过检查输出,您会看到即使您有匿名哈希,它仍然链接到原始:
Before change: %original = ( 'c' => { 'd' => 1 }, 'a' => 1, 'b' => 2 ); $copy = { 'c' => { 'd' => 1 }, 'a' => 1, 'b' => 2 }; After change: %original = ( 'c' => { 'd' => 'foo' }, 'a' => 1, 'b' => 2 ); $copy = { 'c' => { 'd' => 'foo' }, 'a' => 1, 'b' => 2 };
my $new_hash = { %existing_hash };
请注意,此解决方案不会进行深层复制.阅读brian的答案进行解释.
我想你在这里需要小心.考虑以下哈希:
my %hash = (1 => 'one',2 => 'two');
有两种方法可以从中获得参考:
my $ref = \%hash; my $anon = {%hash};
$ref
是对原始哈希的引用,可以类似地使用%hash
. $anon
是对原始哈希的匿名副本的引用; 它将具有相同的数据,但更改它不会更改原始哈希,反之亦然.
因此,例如,从这两个语句开始将具有相同的输出
print $ref->{1},"\n"; > one print $anon->{1},"\n"; > one
但是,如果我更改原始哈希:
$hash{1} = "i";
他们两个print
语句会输出不同的值:
print $ref->{1},"\n"; > i print $anon->{1},"\n"; > one