0

我有一个二维哈希。

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

我想检索这样的哈希:

%hashSlice = %Hash{'a'};

hashSlice 应该在哪里:

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

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

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

4

2 回答 2

3

假设你的哈希是 %myHash,你可以复制“Hash-Slice”

%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'
    };
于 2020-07-08T11:18:06.413 回答
1

你真的不想在这里切片;那些同时检索多个值。您正在访问哈希的单个元素以获取单个值,因此通常的单元素访问是您想要的:

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

该值恰好是另一个哈希引用。我只是把它作为参考,然后继续生活。但是,作为参考,你有一个浅拷贝。修改 in 中的哈希$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);

切片

您使用哈希切片来获取多个值。当他们说“哈希切片”时,这对大多数人来说意味着什么(因为这是几十年来哈希唯一的切片)。@那里的意思是“多个值” :

 my @values = @MyHash{ @keys };

但是,还有一个返回键和值的“键值”切片(类似于each它的方式):

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

你不关心密钥a,你只想要价值。这仍然是一个太深的层次:

$VAR1 = {
      'a' => {
          'a1' => 'v1',
          'a2' => 'v2'
          }
    };
于 2020-07-09T06:51:42.167 回答