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 的评论,我应该补充一点,如果这段代码是在代码审查中提交给我的,我建议重写它以使用显式哈希与您的原始代码一样可变。
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 的评论,我应该补充一点,如果这段代码是在代码审查中提交给我的,我建议重写它以使用显式哈希与您的原始代码一样可变。