【问题标题】:Declare and populate a hash table in one step in Perl在 Perl 中一步声明并填充哈希表
【发布时间】:2012-08-14 00:55:54
【问题描述】:

目前当我想建立一个查找表时,我使用:

my $has_field = {};
map { $has_field->{$_} = 1 } @fields;

有没有一种方法可以一步完成内联初始化? (即在我声明它的同时填充它?)

【问题讨论】:

    标签: perl hash initialization lookup-tables hashref


    【解决方案1】:

    只需使用您的地图创建一个列表,然后放入一个哈希引用中,例如:

    my $has_field = { map { $_ => 1 } @fields };
    

    【讨论】:

      【解决方案2】:

      更新:抱歉,这并不完全符合您的要求,因为您仍然必须先声明 $has_field。

      您可以使用哈希切片:

      @{$has_field}{@fields} = (1)x@fields;
      

      右侧是使用x 运算符通过@fields 的标量值(即数组中的元素数)重复一个。同样的另一个选择:

      @{$has_field}{@fields} = map {1} @fields;
      

      【讨论】:

      • 这可以正常工作,但在使用use strict; 时仍需要单独声明$has_field。不过,这仍然是一个很好的技巧。
      【解决方案3】:

      我在smart match 测试过的地方可以比创建查找哈希和测试值一次 快 2 到 5 倍。因此,除非您要多次重复使用哈希,否则最好进行智能匹配:

      if ( $cand_field ~~ \@fields ) { 
         do_with_field( $cand_field );
      }
      

      记住,从 5.10 开始,Perl 现在有一种方式native 来询问“这个未经测试的值是这些已知值中的任何一个吗”,这是一件好事,它是智能匹配 .

      【讨论】:

      • 感谢这个伟大的提示。我肯定会使用它。
      猜你喜欢
      • 2014-10-24
      • 2011-05-07
      • 2019-09-04
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2013-05-14
      相关资源
      最近更新 更多