【问题标题】:perl hash load two mapsperl 哈希加载两个映射
【发布时间】:2014-03-28 21:52:58
【问题描述】:

我正在尝试创建函数哈希。有多个函数,每个函数都将基于一个键调用。函数和键之间存在一对多的关系。以下工作,但似乎效率低下。 (请注意,我还有更多要加载的函数,但有两个函数很重要。)

以下方法可行,但似乎效率低下,尤其是在处理多个功能时(两个看起来还不错):

my %funcs = ( map {$_ => \&gt_3} qw (PH DO PWL DEPTH BARO ABSP));
%funcs = (%funcs,
   map {$_ => \&lt_one_third} qw (SPCO SALT RHUM));

我想做的是:

my %funcs = (map  {$_ => \&gt_3} qw (PH DO PWL DEPTH BARO ABSP),
   map {$_ => \&lt_one_third} qw (SPCO SALT RHUM));

我只是不明白为什么第一个有效而第二个无效。在我看来,在每种情况下,右侧都会创建两个哈希值。

谢谢

【问题讨论】:

    标签: perl hash maps


    【解决方案1】:

    你有

    my %funcs = (map  {$_ => \&gt_3} qw (PH DO PWL DEPTH BARO ABSP),
       map {$_ => \&lt_one_third} qw (SPCO SALT RHUM));
    

    如果你在 map 的参数周围添加括号,你会得到:

    my %funcs = (map( {$_ => \&gt_3} qw (PH DO PWL DEPTH BARO ABSP),
       map({$_ => \&lt_one_third} qw (SPCO SALT RHUM))));
    

    如果你把它清理干净,你会得到:

    my %funcs = (
       map({ $_ => \&gt_3 }
          qw( PH DO PWL DEPTH BARO ABSP ),
          map({ $_ => \&lt_one_third }
             qw( SPCO SALT RHUM ),
          ),
       )
    );
    

    如您所见,您将以下内容传递给第一张地图:

    'PH', ..., 'SPCO', \&lt_one_third, 'SALT', \&lt_one_third, 'RHUM', \&lt_one_third
    

    您需要做的就是将括号放在地图的 args 周围您想要的位置:

    my %funcs = (
       map( { $_ => \&gt_3          } qw( PH DO PWL DEPTH BARO ABSP ) ),
       map( { $_ => \&lt_one_third  } qw( SPCO SALT RHUM ) ),
    );
    

    大多数人不知道您可以在地图的 args 周围使用括号,因此他们将使用以下内容:

    my %funcs = (
       ( map { $_ => \&gt_3          } qw( PH DO PWL DEPTH BARO ABSP ) ),
       ( map { $_ => \&lt_one_third  } qw( SPCO SALT RHUM ) ),
    );
    

    这样也好。

    【讨论】:

    • 谢谢。我曾尝试过,但意识到查看您的代码时我在第一张地图中省略了括号。
    【解决方案2】:

    尝试在两个 map 周围使用额外的括号(或至少在第一个周围)

    my %funcs = (
       ( map {$_ => \&gt_3} qw(PH DO PWL DEPTH BARO ABSP) ),
       ( map {$_ => \&lt_one_third} qw(SPCO SALT RHUM) ),
    );
    

    【讨论】:

    • 这没什么区别。发生的事情(我第一次应该这么说)是所有键都已加载,但值始终是指向第一个函数的指针。
    • @Dave NYC,mpapec 的解决方案确实解决了这个问题。问题是第二张地图是第一张地图的一个参数,但他使用括号来改变这一点。
    • @DaveNYC 第一组键是指第一个子,第二个是第二个。 eval.in/128104
    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 2014-05-06
    • 1970-01-01
    相关资源
    最近更新 更多