perl:将哈希值调用为方法

时间:2014-04-05 20:58:35

标签: perl hash

我有一个常用的hash或hashref。

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

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

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

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

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

当然,我可以为这个哈希编写类,然后TIE它,但它是非常手动的; 我正在寻找一种自动准备哈希的魔法模块。我忘了它的名字

3 个答案:

答案 0 :(得分:4)

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

  • 可维护性:当哈希访问看起来不像哈希访问时,那就不好了。
  • 性能:方法调用比散列访问要贵得多。
  • 正确性:过量的聪明可能使其他聪明的代码破裂。保持你的代码简单和愚蠢。

此外,这将保存您的任何输入,因为哈希访问中的键是自动引用的:

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

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

答案 1 :(得分:4)

我不知道任何预先编写的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

答案 2 :(得分:2)

如果您想使用一组固定的键作为结构值,您可能需要Struct::Dumb

use Struct::Dumb;

struct Point => ['x', 'y', 'z'];

my $p = Point(10, 20, 30);
$p->x = 40;