![](/img/trans.png)
[英]In Perl, how can I extract a list of ID fields from an array of hashrefs?
[英]How can I return a list of hashrefs from a map in Perl?
我有以下幾乎正常的代碼:
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
]};
但是這會產生語法錯誤。 我怎樣才能做我想要的,或者我現在的版本是最好的?
更新 :抱歉以前的額外分號。 現在已經很晚了。 不知道我是怎么錯過它的。 多謝你們!
它只提供語法錯誤,因為Perl認為你需要在map { ... }
之后省略逗號,因為它將該映射解析為塊,而不是表達式。 把+
放在前面會解決這個問題。 此外,您不能在匿名哈希中使用分號:
my $results = { data => [
map +{
# ^----------------- plus sign added
%{$_->TO_JSON},
display_field => $_->display_field($q);
# ^---- should be comma or nothing
}, $rs->all
]};
問題是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
添加了很多東西。
我不完全確定你正在尋找什么樣的結構。 第一個示例中的map
已經返回hashrefs列表(每個版本的$f
)。
如果您只想要與第二個示例類似的語法,那么您幾乎是正確的; 你需要擺脫你的地圖塊中無關的分號,並使用一對curlies來制作一個匿名的散列引用。
就像是:
my $results = { data => [
map { { %{$_->TO_JSON},
display_field => $_->display_field($q)
}
} $rs->all
]};
我總是在塊形式中使用map,並構造代碼以便於分離。 雖然你可以在開頭卷曲前放一個+來使用表達形式,但這對你真的很重要嗎?
除了發生的一切,你的第一個例子看起來很好。 繼續前進並解決實際問題。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.