【问题标题】:perl: call hash values as methodsperl:将哈希值称为方法
【发布时间】:2014-04-05 20:58:34
【问题描述】:

我有一个常用的 hash 或 hashref。

my %hash; $hash{'key'} = 'value';

所有这些引号和花括号都不是很容易 我知道有一个技巧可以像方法一样调用哈希值:

$hash->key = 'value'; # even no need for round brackets !

可能是使用了一些magick模块,我知道它存在,我曾经看过这段代码:

use CallHashLikeMethods 'hash';
$hash->key = 'value';

当然,我可以为这个散列写一个类然后TIE它,但它是非常手动的; 我正在寻找一个自动准备哈希的神奇模块。我只是忘记了它的名字

【问题讨论】:

    标签: perl hash


    【解决方案1】:

    你要求做的是一个相当糟糕的主意:

    • 可维护性:当哈希访问看起来不像哈希访问时,这很糟糕。
    • 性能:方法调用比哈希访问要昂贵得多。
    • 正确性:过度聪明可能会使其他聪明的代码中断。让您的代码保持简单和愚蠢。

    此外,这不会为您节省任何输入,因为哈希访问中的键是自动引用的:

    $hash{key} = 'value';
    $hash->key = 'value';
    

    ...只要密钥是有效的裸字。

    【讨论】:

      【解决方案2】:

      我不知道有任何预先编写的 CPAN 模块可以做到这一点,但这并不难......

      use v5.10;
      use strict;
      use warnings;
      
      sub HASH::AUTOLOAD :lvalue {
        my ($key) = ($HASH::AUTOLOAD =~ /(\w+)\z/);
        shift->{$key};
      }
      
      my $hash = {
        foo => 1,
        bar => 0,  # not 2
        baz => 3,
      };
      
      bless($hash, 'HASH');
      
      $hash->bar = 1;
      $hash->bar++;
      
      say $hash->foo;
      say $hash->bar;
      say $hash->baz;
      

      我同意 amon 的观点 - 正常的哈希访问会更清晰、更快,而且语法并不繁琐。

      更新:为它找到了一个 CPAN 模块:Hash::AsObject

      【讨论】:

      • Re “而且语法并不繁琐”,是的,尤其是如果您停止使用不必要的引号并使用 $hash{key} 而不是 $hash{'key'}
      【解决方案3】:

      如果你想使用一组固定的键作为结构值,你可能喜欢Struct::Dumb

      use Struct::Dumb;
      
      struct Point => ['x', 'y', 'z'];
      
      my $p = Point(10, 20, 30);
      $p->x = 40;
      

      【讨论】:

        猜你喜欢
        • 2010-10-20
        • 2012-11-21
        • 2017-06-21
        • 2012-11-11
        • 1970-01-01
        • 2020-12-08
        • 1970-01-01
        • 2013-06-06
        • 1970-01-01
        相关资源
        最近更新 更多