当前位置:  开发笔记 > 编程语言 > 正文

如何从Perl中的现有哈希创建匿名哈希?

如何解决《如何从Perl中的现有哈希创建匿名哈希?》经验,为你挑选了3个好方法。

如何从现有哈希创建匿名哈希?

对于数组,我使用:

@x = (1, 2, 3);
my $y = [@x];

但我找不到如何为哈希做同样的事情:

my %x = ();
my $y = ???;

谢谢



1> brian d foy..:

为什么需要匿名哈希?虽然答案告诉你各种方法可以制作一个匿名哈希,但我们不知道它们中的任何一个是否是你想要做的任何事情的正确解决方案.

如果您想要一个可以在不打扰原始数据的情况下修改的独特副本,请使用dclonePerl附带的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
        };



2> Kaarel..:
my $new_hash = { %existing_hash };

请注意,此解决方案不会进行深层复制.阅读brian的答案进行解释.



3> Dave Webb..:

我想你在这里需要小心.考虑以下哈希:

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

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有