纯粹的学术问题,我没有在这里看到禁止它们的说明(虽然没有'学术'标签我能找到)。
如果我有一个像下面这样的现有哈希,我可以截取它的切片(?),如下所示:
my %hash = (one=>1, two=>2, three=>3, four=>4);
my ($two, $four) = @hash{'two','four'};
如果从像这样的示例函数返回哈希,有没有办法做到这一点?
sub get_number_text
{
my %hash = (one=>1, two=>2, three=>3, four=>4);
return %hash;
}
一种有效的方法是:
my ($two, $four) = @{ { get_number_text() } }{'two', 'four'};
据我所知,函数返回一个散列键/值列表,内部{}创建一个匿名散列/ ref,而@ {}使用引用将其“强制转换”为一个列表,即自Perl以来的哈希切片知道ref是一个哈希。 (我最后一点工作有点惊讶,但Perl的功能更强,等等。)
但这是在一个表达式中写出这种公认的奇怪访问的最明确方式吗?
答案 0 :(得分:6)
通常,避免从子例程返回展平的散列(return %foo
);如果不将其复制到另一个哈希中,它将更难以使用。最好返回哈希引用(return \%foo
)。
但是,这是最明确的方式。虽然经常使用qw:
给出硬编码密钥列表my ($two, $four) = @{ { returnit() } }{ qw/two four/ };