如何在Perl中获取哈希的唯一部分?

Tim*_*mmy 21 perl hash

有没有办法获得子哈希?我需要使用哈希切片吗?

例如:

%hash = ( a => 1, b => 2, c => 3 );
Run Code Online (Sandbox Code Playgroud)

我只想要

%hash = ( a => 1, b => 2 );
Run Code Online (Sandbox Code Playgroud)

Cha*_*ens 54

散列片返回与键列表关联的值.为了让你改变印记为@散片,并提供键的列表(在这种情况下,"a""b"):

my @items = @hash{"a", "b"};
Run Code Online (Sandbox Code Playgroud)

通常,您可以使用引用字运算符来生成列表:

my @items = @hash{qw/a b/};
Run Code Online (Sandbox Code Playgroud)

您也可以分配一个哈希切片,因此如果您想要一个包含另一个哈希子集的新哈希,您可以说

my %new_hash;
@new_hash{qw/a b/} = @hash{qw/a b/};
Run Code Online (Sandbox Code Playgroud)

很多人会使用地图而不是哈希切片:

my %new_hash = map { $_ => $hash{$_} } qw/a b/;
Run Code Online (Sandbox Code Playgroud)

从Perl 5.20.0开始,如果使用%sigil而不是@sigil,则可以一步获取键和值:

my %new_hash = %hash{qw/a b/};
Run Code Online (Sandbox Code Playgroud)

  • 您应该更清楚地表明哈希切片只具有值,而不是键/值对. (5认同)

Chr*_*utz 9

您可能想要组合所需的键列表:

my @keys = qw(a b);
Run Code Online (Sandbox Code Playgroud)

然后使用循环来制作哈希:

my %hash_slice;
for(@keys) {
  $hash_slice{$_} = %hash{$_};
}
Run Code Online (Sandbox Code Playgroud)

要么:

my %hash_slice = map { $_ => $hash{$_} } @keys;
Run Code Online (Sandbox Code Playgroud)

(我的偏好是第二个,但无论你喜欢哪个最好.)


Hyn*_*dil 6

另一种方式:

my @keys = qw(a b);
my %hash = (a => 1, b => 2, c => 3);
my %hash_copy;
@hash_copy{@keys} = @hash{@keys};
Run Code Online (Sandbox Code Playgroud)