匿名哈希切片 - 语法?

msw*_*erg 9 perl

我喜欢哈希切片并经常使用它们:

my %h;
@h{@keys}=@vals;
Run Code Online (Sandbox Code Playgroud)

工作出色!但有两件事总是让我烦恼.

首先,是否可以将上面的两行组合成一行代码?声明哈希并立即填充它会很好.

其次,是否可以对现有的匿名哈希进行切片...类似于:

my $slice=$anonh->{@fields}
Run Code Online (Sandbox Code Playgroud)

yst*_*sth 8

对于您的第一个问题,请在一行代码中执行此操作:

@$_{@keys}=@vals for \my %h;
Run Code Online (Sandbox Code Playgroud)

要么

map @$_{@keys}=@vals, \my %h;
Run Code Online (Sandbox Code Playgroud)

但我不会这样做; 这是一种令人困惑的写作方式.

两个版本都声明变量并立即对其进行引用并将其别名引用到$_引用,以便可以在片中使用哈希引用.这允许您在现有范围中声明变量; @{ \my %h }{@keys} = @vals;也"工作",但有一个不幸的缺点,即确定哈希切%h片中的那个小块.

对于第二个问题,如上所示,切片可用于哈希引用; 请参阅http://perlmonks.org/?node=References+quick+reference以了解一些易于记忆的规则.

my @slice = @$anonh{@fields};
Run Code Online (Sandbox Code Playgroud)

或者你的意思是:

my $slice = [ @$anonh{@fields} ];
Run Code Online (Sandbox Code Playgroud)

但@ slice/$ slice有一个值的副本.要获取哈希值的别名数组,您可以执行以下操作:

my $slice = sub { \@_ }->( @$anonh{@fields} );
Run Code Online (Sandbox Code Playgroud)


ike*_*ami 8