【发布时间】:2014-10-19 22:03:33
【问题描述】:
在this answer 中,我找到了一个简单的TO_JSON 方法的推荐,这是将祝福对象序列化为JSON 所必需的。
sub TO_JSON { return { %{ shift() } }; }
谁能详细解释一下它是如何工作的?
我改成:
sub TO_JSON {
my $self = shift; # the object itself – blessed ref
print STDERR Dumper $self;
my %h = %{ $self }; # Somehow unblesses $self. WHY???
print STDERR Dumper \%h; # same as $self, only unblessed
return { %h }; # Returns a hashref that contains a hash.
#return \%h; # Why not this? Works too…
}
很多问题... :( 简单地说,我无法理解 3 行 Perl 代码。;(
我需要TO_JSON,但它会过滤掉:
- 不需要的属性和
- 也未设置属性(例如,对于那些
has_${attr}谓词返回 false)
这是我的代码——它有效,但我真的不明白为什么 unblessing 有效……
use 5.010;
use warnings;
use Data::Dumper;
package Some;
use Moo;
has $_ => ( is => 'rw', predicate => 1,) for (qw(a1 a2 nn xx));
sub TO_JSON {
my $self = shift;
my $href;
$href->{$_} = $self->$_ for( grep {!/xx/} keys %$self );
# Same mysterious unblessing. The `keys` automagically filters out
# “unset” attributes without the need of call of the has_${attr}
# predicate… WHY?
return $href;
}
package main;
use JSON;
use Data::Dumper;
my @objs = map { Some->new(a1 => "a1-$_", a2 => "a2-$_", xx=>"xx-$_") } (1..2);
my $data = {arr => \@objs};
#say Dumper $data;
say JSON->new->allow_blessed->convert_blessed->utf8->pretty->encode($data);
编辑:澄清问题:
-
%{ $hRef }解除对$hRef的引用(获取引用指向的哈希),但为什么要从 blessed 对象引用$self获取普通哈希? - 换句话说,为什么
$self是一个hashref? 我尝试制作像@{$self}{ grep {!/xx/} keys %$self}这样的哈希切片,但没有成功。因此我创造了那个可怕的TO_JSON。- 如果
$self是一个hashref,为什么keys %$self只返回具有值的属性,而不是所有声明的属性(例如nn也是——参见has)?
【问题讨论】:
-
第二和第四是 moose 相关的(perl OO 主要使用 hashref 进行对象存储)。哈希切片仅返回值,如果我是正确的,您需要键/值对。
-
my %h = map { $_ => $self->{$_} } grep { !/xx/ } keys %$self或my %h = %$self; delete @h{ grep /xx/, keys %$self } -
@mpapec - 谢谢,你的评论帮助我找到了一个错误。我有 perl 5.20,所以可以使用
return { %{$self}{ grep { !/xx/ } keys %$self } };- 它终于可以工作了:)(键/值哈希片)。问题出在第一个印记@。以这种形式,它实际上返回一个值。 :) 很高兴有你。 ;) :)