添加TO_JSON方法(通过JSON.pm将祝福的引用转换为CGI :: Cookie)如果我这样做:
package CGI::Cookie;
sub TO_JSON {
return {
map { name => $_->name,
value => $_->value,
domain => $_->domain,
path => $_->path,
expires => $_->expires }
shift
}
}
XXX.pm第76行的语法错误,XXX.pm附近的“shift”语法错误 第77行,接近“}”编辑在(eval 50)第3行的require中失败。
但如果我这样做:
package CGI::Cookie;
sub TO_JSON {
return {
map { ''.'name' => $_->name,
value => $_->value,
domain => $_->domain,
path => $_->path,
expires => $_->expires }
shift
}
}
它有效
不能为我的生活找出原因。也只是引用“名称”没有帮助。我必须连接一个空字符串才能工作。
我很神秘。
答案 0 :(得分:2)
Perl语法在块和匿名hashrefs方面有点含糊不清。当Perl无法正确猜测时,您可以强制执行正确的解释:
+{ ... }
{; ... }
在map
成为代码块后强制阻止解决问题。之前它认为该块是匿名哈希,并且在shift
之前错过了逗号:map
可以是map EXPR, LIST
形式,并且hashref是有效表达式。
子使用误用map
将一个元素分配给$_
。最好写一下:
sub TO_JSON {
my $o = shift; # my $_ should work as well, but that is beside the point
return +{
name => $o->name,
value => $o->value,
domain => $o->domain,
path => $o->path,
expires => $o->expires,
};
}
但它可以缩写为
sub TO_JSON {
my $o = shift;
return +{
map { $_ => $o->$_() } qw/name value domain path expires/
};
}