如何使用带有哈希引用的foreach?

San*_*ing 25 perl hash

我有这个代码

foreach my $key (keys %ad_grp) {

    # Do something
}
Run Code Online (Sandbox Code Playgroud)

哪个有效.

如果我没有%ad_grp,但是参考$ad_grp_ref,那么对于哈希来说会是什么样子?

mob*_*mob 58

foreach my $key (keys %$ad_grp_ref) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

Perl::Critic 和达西姆推荐的风格

foreach my $key (keys %{ $ad_grp_ref }) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

出于对可读性和维护的担忧(因此,当您需要使用时,您不需要仔细考虑要改变%{ $ad_grp_obj[3]->get_ref() }的内容%{ $ad_grp_ref })

  • 那不是更好,那更糟.此外,http://perlmonks.org/?node = Reference + quick + reference可能非常有用 (10认同)
  • 如果你教出更好的风格,你会得到更多的赞成:[`keys%{$ ad_grp_ref}`](http://p3rl.org/Perl::Critic::Policy::References::ProhibitDoubleSigils) (8认同)
  • `keys%$ ad_grp_ref`更具可读性,尤其是在被其他外接操作符包围时. (6认同)
  • 我完全同意ysth,没有理由让表达比它需要的更复杂. (5认同)

oyl*_*gul 8

在Perl 5.14(它现在在Perl 5.13中工作)中,我们将能够在哈希引用上使用键

use v5.13.7;

foreach my $key (keys $ad_grp_ref) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 现在禁止使用标量上的实验键。此功能已在5.22中删除。(ish) (4认同)

Dav*_* W. 5

正如其他人所述,您必须取消引用该引用。该keys函数要求其参数以开头:

我的偏好:

foreach my $key (keys %{$ad_grp_ref}) {
Run Code Online (Sandbox Code Playgroud)

康威

foreach my $key (keys %{ $ad_grp_ref }) {
Run Code Online (Sandbox Code Playgroud)

猜猜你应该听谁的话...

您可能需要阅读Perl参考文档

如果您发现自己做了很多工作,引用了哈希表,哈希表和哈希表,那么您可能要开始考虑使用面向对象的Perl了。有很多不错的小教程的 Perl的文档。