簡體   English   中英

如何從Perl中的地圖返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM