我有一个常用的hash或hashref。
my %hash; $hash{'key'} = 'value';
所有这些引号和大括号都不是很容易 我知道有一种方法可以像方法一样调用哈希值:
$hash->key = 'value'; # even no need for round brackets !
可能是使用了一些magick模块,我知道它存在,我已经看过这个代码了一次:
use CallHashLikeMethods 'hash';
$hash->key = 'value';
当然,我可以为这个哈希编写类,然后TIE它,但它是非常手动的; 我正在寻找一种自动准备哈希的魔法模块。我忘了它的名字
答案 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;