如何将二维的一个元素存储在另一个哈希中



我有一个二维哈希。

myHash = (
'a' => {
'a1' => v1
'a2' => v2
}
'b' => {
'b1' => v3
'b2' => v4
}
);

我想检索这样的散列:

%hashSlice = %Hash{'a'};

hashSlice应该在哪里:

%hashSlice = (
'a1' => v1
'a2' => v2
);

我已经尝试了%、$和@的所有组合。我也看过这里。

我似乎无法从二维散列中得到一个散列。我不想为此使用任何库。我是perl的新手。任何帮助都将不胜感激。

假设您的哈希为%myHash,则可以复制"散列切片";带有

%hashSlice = %{$myHash{a}};

更正上面的其他拼写错误:

use strict;
use warnings;

my %myHash = (
'a' => {
a1 => 'v1',
a2 => 'v2'
},
'b' => {
b1 => 'v3',
b2 => 'v4'
}
);
use Data::Dumper;
my %hashSlice = %{$myHash{a}};
print Dumper (%hashSlice);

打印

$VAR1 = {
'a1' => 'v1',
'a2' => 'v2'
};

您并不是真的想要一个切片;它们同时检索多个值。您正在访问散列的单个元素以获得单个值,因此通常的单个元素访问就是您想要的:

my $value = $MyHash{'a'};

该值恰好是另一个哈希引用。我只想把它作为参考,继续生活。但是,作为参考,您有一个浅副本。修改$value中的散列将修改%MyHash中的值。

您可以取消对它的引用,并将其分配给一个新的哈希。这也是一个浅层副本,但现在仅适用于值(如果有第二层嵌套(:

my %NewHash = %$value;

这与您使用的语法相同,但去掉了大括号,因为我使用了一个简单的标量:

my %NewHash = %{ ...some hash ref... };

我更喜欢后缀取消引用:

use v5.26;
my %NewHash = $value->%*;

如果您想要一个完全断开连接的副本,Storable可以为您做到这一点:

use Storable qw(dclone);
my $deep_copy = dclone($value);

切片

您可以使用哈希切片来获取多个值。当他们说";散列切片";,这就是它对大多数人的意义(因为这是几十年来哈希唯一的切片(。CCD_ 3在那里表示";多个值":

my @values = @MyHash{ @keys };

但是,也有一个";关键字值";返回键和值的切片(类似于each的操作(:

use v5.20;
my %hash = %MyHash{ @keys };

你不在乎密钥a,你只想要值。这仍然有一个层次太深:

$VAR1 = {
'a' => {
'a1' => 'v1',
'a2' => 'v2'
}
};

最新更新