真的很奇怪的perl语法错误添加TO_JSON方法来打包

时间:2013-04-18 19:34:13

标签: json perl cookies mod-perl

添加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
    }
}

它有效

不能为我的生活找出原因。也只是引用“名称”没有帮助。我必须连接一个空字符串才能工作。

我很神秘。

1 个答案:

答案 0 :(得分:2)

Perl语法在块和匿名hashrefs方面有点含糊不清。当Perl无法正确猜测时,您可以强制执行正确的解释:

  • Hashref +{ ... }
  • 代码块 {; ... }

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/
    };
}