我有一个任意的数据结构,我想把它当作一个对象。我将此作为REST应用程序的响应。以下示例。 CPAN上有一些模块可以做到这一点。 Data :: Object看起来对我来说最好,但它是2011年的最后一次更新。我错过了什么吗?是否有一种简单的Moose方法可以做到这一点?谢谢!
$o=$class->new($response);
$s=$o->success;
@i=$o->items;
{
'success' => bless( do{\(my $o = 1)}, 'JSON::XS::Boolean' ),
'requestNumber' => 5,
'itemsCount' => 1,
'action' => 'search.json',
'totalResults' => 161,
'items' => [
{
'link' => 'http://europeana.eu/api//v2/record/15503/E627F23EF13FA8E6584AF8706A95DB85908413BE.json?wskey=NpXXXX',
'provider' => [
'Kulturpool'
],
'europeanaCollectionName' => [
'15503_Ag_AT_Kulturpool_khm_fs'
],
# more fields omitted
}
],
'apikey' => 'Npxxxx'
};
答案 0 :(得分:1)
虽然我不喜欢使用它,但定义AUTOLOAD
子例程是一种动态创建任意类的方法。我使用它已经有一段时间了,但看起来应该是这样的:
package Local::Foo;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
sub AUTOLOAD {
my $self = shift;
my $value = shift;
our $AUTOLOAD;
(my $method = $AUTOLOAD) = s/.*:://;
if ( defined $value ) {
$self->{$method} = $value;
}
return $self->{$method};
}
此类Local::Foo
具有无限量的方法。例如,如果我说
$foo->bar("fubar");
这与:
相同$foo->{bar} = "foobar";
如果我拨打$foo->bar;
,则会返回$foo->{bar};
的值。
您可能想要限制方法的样式及其值。例如,有了这个:
$foo->BAR;
$foo->Bar;
$foo->bar;
是三种有效且完全不同的方法。你可能想要一些东西来确保你的方法匹配一个特定的模式(即,它们都是小写的,或者第一个字母是大写的,其余的是小写的。你可能想确保它们以字母开头,{{1 }}不是一个有效的方法。
一个小问题:一旦定义了$foo->23diba;
子例程,您也可以定义AUTOLOAD
子例程。 Perl在对象被销毁之前调用DESTROY
子例程。如果DESTROY
也需要处理问题。您可能需要添加:
$AUTOLOAD =~ /.*::DESTROY$/
return if $AUTOLOAD =~ /.*::DESTROY$/;
子例程中的某个地方,因此在调用AUTOLOAD
时不会意外地执行某些操作。请记住,只要一个类对象超出范围,就会自动调用它,如果存在,则使用DESTROY
,无论如何都会定义一个。
答案 1 :(得分:0)
这是一个例子:
use strict;
package Foo;
#define a simple Foo class with 3 properties
use base qw(Class::Accessor);
Foo->mk_accessors(qw(name role salary));
package main;
#define a perl hash with the same keys
my $hr = {'name'=>'john doe', 'role'=>'admin', 'salary'=>2500 };
#bless the object
my $obj = bless $hr, 'Foo';
print $obj->name, "\n"; #<-- prints: john doe
答案 2 :(得分:0)
我并不是说这一定是一个好主意,是实现这个想法的最佳方式,或者是免费的。我从未尝试过,直到15分钟前。但它很有趣而且很简洁,所以 -
#!/usr/bin/env perl
BEGIN {
package Role::AutoVacca;
use Moo::Role;
use Scalar::Util "blessed";
sub BUILD {
my $self = shift;
for my $attr ( grep /\A[^_]/, keys %{$self} )
{
Method::Generate::Accessor
->generate_method( blessed($self),
$attr,
{ is => "rw" } );
}
}
package Fakey;
use Moo;
with "Role::AutoVacca";
}
my $fake = Fakey->new({
success => bless( do{\(my $o = 1)}, "JSON::XS::Boolean" ),
items => [ { link => "http://europeana.eu/o/haipi",
provider => [ "mememememe" ] } ],
apikey => "3k437" });
print "I CAN HAZ KEE? ", $fake->apikey, $/;
print "IZ GUD? ", $fake->success ? "YAH" : "ONOES", $/;
print "WUT DIZZYING? ", $fake->items, $/;