1

如果我这样做,则将 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 第 77 行的“shift”附近的语法错误,“}”附近的(eval 50)第 3 行的 require 编译失败。

但如果我这样做:

package CGI::Cookie;
sub TO_JSON {
    return {
        map { ''.'name' => $_->name,
              value => $_->value,
              domain => $_->domain,
              path => $_->path,
              expires => $_->expires }
            shift
    }
}

有用

不能为我的生活弄清楚为什么。同样,仅引用“名称”也无济于事。我必须连接一个空字符串才能工作。

我很迷惑。

4

1 回答 1

2

当涉及到块和匿名 hashrefs 时,Perl 语法有点模棱两可。当 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/
    };
}
于 2013-04-18T19:50:30.573 回答