我喜欢哈希切片并经常使用它们:
my %h;
@h{@keys}=@vals;
Run Code Online (Sandbox Code Playgroud)
工作出色!但有两件事总是让我烦恼.
首先,是否可以将上面的两行组合成一行代码?声明哈希并立即填充它会很好.
其次,是否可以对现有的匿名哈希进行切片...类似于:
my $slice=$anonh->{@fields}
Run Code Online (Sandbox Code Playgroud)
对于您的第一个问题,请在一行代码中执行此操作:
@$_{@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)
第一个问题:
my %h = map { $keys[$_] => $vals[$_] } 0..$#keys;
Run Code Online (Sandbox Code Playgroud)
要么
use List::MoreUtils qw( mesh );
my %h = mesh @keys, @vals;
Run Code Online (Sandbox Code Playgroud)第二个问题:
如果它是...NAME...一个哈希,它是...{ $href }...一个哈希引用,所以
my @slice = @hash{@fields};
Run Code Online (Sandbox Code Playgroud)
是
my @slice = @{ $anonh }{@fields};
Run Code Online (Sandbox Code Playgroud)
如果引用表达式是变量,则curlies是可选的.
my @slice = @$anonh{@fields};
Run Code Online (Sandbox Code Playgroud)