如何从现有哈希创建匿名哈希?
对于数组,我使用:
@x = (1, 2, 3);
my $y = [@x];
但我找不到如何为哈希做同样的事情:
my %x = ();
my $y = ???;
由于
答案 0 :(得分:15)
为什么需要匿名哈希?虽然答案告诉你各种方法可以制作一个匿名哈希,但我们不知道它们中的任何一个是否适合你想做的任何事情。
如果您想要一个可以在不打扰原始数据的情况下修改的独特副本,请使用Perl附带的Storable中的dclone
。它会创建数据结构的深层副本:
use Storable qw(dclone);
my $clone = dclone \%hash;
考虑Dave Webb的答案,但附加一层参考文献。 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
};
答案 1 :(得分:13)
my $new_hash = { %existing_hash };
请注意,此解决方案不会进行深层复制。 阅读brian的答案进行解释。
答案 2 :(得分:8)
我想你在这里需要小心。请考虑以下哈希:
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
答案 3 :(得分:2)
如果你有
my %hash = ...
然后你可以做
my $hashref = \%hash;
答案 4 :(得分:1)
这里似乎有两件事情,答案分为回答两个不同的问题。
如果你想要1,请执行以下操作:
my $hash_ref = { foo => 1, bar => 2 };
如果你想要2,请执行以下操作:
my %hash = ( foo => 1, bar => 2 );
# Then later
my $anon_copy_hash_ref = { %hash };
(这些名字不适用于黄金时段。)我的副本也没有为黄金时间做好准备。请参阅brian的帖子,以获得更全面,更精确的讨论。
答案 5 :(得分:0)
使用:
$hashref = {};
答案 6 :(得分:0)
实现深层复制的快捷方式:
use FreezeThaw qw(freeze thaw);
$new = thaw freeze $old;