来自函数的哈希返回的Perl哈希切片

时间:2013-01-08 22:39:31

标签: perl

纯粹的学术问题,我没有在这里看到禁止它们的说明(虽然没有'学术'标签我能找到)。

如果我有一个像下面这样的现有哈希,我可以截取它的切片(?),如下所示:

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的功能更强,等等。)

但这是在一个表达式中写出这种公认的奇怪访问的最明确方式吗?

1 个答案:

答案 0 :(得分:6)

通常,避免从子例程返回展平的散列(return %foo);如果不将其复制到另一个哈希中,它将更难以使用。最好返回哈希引用(return \%foo)。

但是,这是最明确的方式。虽然经常使用qw:

给出硬编码密钥列表
my ($two, $four) = @{ { returnit() } }{ qw/two four/ };