5

纯粹的学术问题,我在这里没有看到禁止它们的说明(尽管我找不到类似“学术”的标签)。

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

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'};

据我了解,函数返回一个哈希键/值列表,内部 {} 创建一个匿名哈希/引用,并且 @{} 使用引用将其“转换”为一个列表,即哈希切片,因为 Perl 知道引用是一个哈希。(我有点惊讶最后一点起作用了,但是 Perl 的功能更强大,等等)

但这是用一种表达方式来写出这种公认的奇怪访问方式的最清晰的方式吗?

4

1 回答 1

6

一般来说,避免return %foo从子程序返回一个扁平化的哈希();如果不将其复制到另一个哈希中,它就很难使用。最好返回一个哈希引用 ( return \%foo)。

但是,是的,这是最清晰的方法。尽管通常使用 qw 给出硬编码键的列表:

my ($two, $four) = @{ { returnit() } }{ qw/two four/ };
于 2013-01-08T22:48:11.510 回答