我有以下几乎正常的代码:
my $results = { data => [
map {
my $f = $_->TO_JSON;
$f->{display_field} = $_->display_field($q);
$f;
} $rs->all
]};
只有我更喜欢以下内容:
my $results = { data => [
map {
%{$_->TO_JSON},
display_field => $_->display_field($q),
}, $rs->all
]};
但是这会产生语法错误。我怎样才能做我想要的,或者我现在的版本是最好的?
更新:抱歉以前的额外分号。现在已经很晚了。不知道我是怎么错过它的。谢谢你们!
答案 0 :(得分:7)
它只会出现语法错误,因为Perl认为您需要在map { ... }
之后省略逗号,因为它将该映射解析为块,而不是表达式。将+
放在前面会解决这个问题。此外,您不能在匿名哈希中使用分号:
my $results = { data => [
map +{
# ^----------------- plus sign added
%{$_->TO_JSON},
display_field => $_->display_field($q);
# ^---- should be comma or nothing
}, $rs->all
]};
答案 1 :(得分:3)
问题在于Perl看起来不够远,无法确定{
是否意味着“启动匿名哈希引用”或“启动代码块”。 应该(理想情况下)查看相应的}
并查看是否有逗号,并相应地采取行动,但事实并非如此。它只是看起来有点前进并试图猜测。这次是错的,你得到一个不应该存在的逗号的语法错误,除了它应该不移动它。
perldoc -f map
会告诉你所有这些。基本上,它说如果你放+{
,Perl会明白这意味着“不是代码块”并猜测它是一个哈希引用。这可能是您的语法错误的原因。作为另一个建议,可能会说map({ HASH STUFF }, $rs->all)
- 我敢打赌,Perl不会猜测它是代码参考。
我无法让它发挥作用,但没有$rs
或->TO_JSON
或名为$q
的变量我无论如何都无法使用它。我希望这有帮助。如果没有,请发布更多代码。别担心,我们不咬人。
此外,虽然我们正在努力,但为什么不这样写呢:
my $results;
$results->{data} = [ map MAGIC MAP STUFF, $rs->all ];
可能更具可读性,特别是如果你同时向$results
添加大量内容。
答案 2 :(得分:1)
我不完全确定你正在寻找什么样的结构。第一个示例中的map
已经返回了一个hashrefs列表($f
的每个版本)。
如果您只想要与第二个示例类似的语法,那么您几乎是对的;你需要摆脱你的地图块中无关的分号,并使用一对curlies来制作一个匿名的散列引用。
类似的东西:
my $results = { data => [
map { { %{$_->TO_JSON},
display_field => $_->display_field($q)
}
} $rs->all
]};
答案 3 :(得分:0)
我总是在块形式中使用map,并构造代码以便于分开。虽然你可以在开头卷曲前放一个+来使用表达形式,但这对你真的很重要吗?
除了发生的一切,你的第一个例子看起来很好。继续前进并解决实际问题。 :)