perl 使用子例程作为 foreach 的参数

perl using subroutine as argument of a foreach

my %number_words = hash_a_file($_);
foreach my $key ( keys %number_words ) {
    ++$word_list{$key};
}

这是可行的,但我想避免使用中间变量 像这样

foreach my $key ( keys hash_a_file($_) ) {
    ++$word_list{$key};
}

我尝试使用 refs 但还是失败了。有什么办法吗?谢谢!

Return 一个 hashref,这样你就可以为 keys(而不是列表)

形成一个有效的参数
sub hash_a_file { return { a => 1, b => 2 } }

foreach my $key ( keys %{ hash_a_file() } ) {
    say $key
}

事实是,子例程不会 return 散列。它 return 是一个列表。在您的原始代码中,只有将其存储在散列变量中时,它才会成为散列。

但是还有其他方法可以从列表中创建散列。您可以创建一个匿名散列,然后取消引用它。它很丑,但它有效。

# Inner braces create an anonymous hash.
# Outer braces de-reference that into a "real" hash
foreach my $key ( keys %{ { hash_a_file($_) } } ) {
    ++$word_list{$key};
}

更新: 为了支持 Borodin 的评论,我应该补充一点,如果这段代码是在代码审查中提交给我的,我建议重写它以使用显式哈希与您的原始代码一样可变。