有没有办法获得子哈希?我需要使用哈希切片吗?
例如:
%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)
您可能想要组合所需的键列表:
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)
(我的偏好是第二个,但无论你喜欢哪个最好.)
另一种方式:
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)