Pergunta

Eu tenho o seguinte código principalmente ok:

my $results = { data => [
   map {
      my $f = $_->TO_JSON;
      $f->{display_field} = $_->display_field($q);
      $f;
   } $rs->all
]};

Só prefiro que fosse mais como o seguinte:

my $results = { data => [
   map {
      %{$_->TO_JSON},
      display_field => $_->display_field($q),
   }, $rs->all
]};

Mas isso fornece um erro de sintaxe. Como posso fazer o que quero ou a minha versão atual é a melhor que recebe?

atualizar: Desculpe pelo semicolon extra de antes. Está tarde aqui. Não tenho certeza de como eu perdi. Obrigado rapazes!

Foi útil?

Solução

Ele apenas dá um erro de sintaxe porque você acha que precisa omitir a vírgula depois map { ... }, porque é analisar esse mapa como um bloco, não uma expressão. Colocando + na frente irá consertar isso. Além disso, você não pode ter um ponto e vírgula em um hash anônimo:

my $results = { data => [
   map +{
#      ^----------------- plus sign added
      %{$_->TO_JSON},
      display_field => $_->display_field($q);
#                                           ^---- should be comma or nothing
   }, $rs->all
]};

Outras dicas

O problema é que Perl não parece o suficiente para descobrir se { significa "iniciar uma referência anônima de hash" ou "iniciar um bloco de código". Isto deve (idealmente) olhar para o correspondente } E veja se existe ou não uma vírgula, e aja de acordo, mas não. Parece um pouco à frente e tenta adivinhar. E desta vez está errado, e você recebe um erro de sintaxe sobre uma vírgula que não deveria estar lá, exceto que ele não deve movê -lo.

perldoc -f map Vou contar tudo sobre isso. Basicamente, diz que se você colocar +{, Perl entenderá que isso significa "não um bloco de código" e adivinhe que é uma referência de hash. Essa é provavelmente a causa do seu erro de sintaxe. Como outra sugestão, pode funcionar para dizer map({ HASH STUFF }, $rs->all) - Aposto que o dinheiro Perl não acho que seja uma referência de código aqui.

Eu não conseguia fazer funcionar, mas não ter $rs ou a ->TO_JSON ou uma variável nomeada $q Eu não conseguia fazer nada disso funcionar de qualquer maneira. Eu espero que isso ajude. Caso contrário, poste um pouco mais de código. Não se preocupe, nós não mordemos.

Além disso, enquanto estamos nisso, por que não escrever desta maneira:

my $results;
$results->{data} = [ map MAGIC MAP STUFF, $rs->all ];

Pode ser sem dúvida mais legível, especialmente se você estiver adicionando muitas coisas a $results tudo de uma vez.

Não sei completamente que tipo de estrutura você está procurando. o map No seu primeiro exemplo, já retorna uma lista de hashrefs (cada versão de $f).

Se você deseja apenas sintaxe semelhante ao seu segundo exemplo, estava quase certo; Você precisa se livrar do semicolon estranho no seu bloco de mapas e usar um par de enrolados para fazer um hash anônimo.

Algo como:

my $results = { data => [
    map { { %{$_->TO_JSON},
            display_field => $_->display_field($q)
          }
    } $rs->all
]};

Eu sempre uso o mapa no formulário de bloco e estruturo o código para que seja fácil separar. Embora você possa colocar A + na frente da abertura encaracolada para usar a forma de expressão, isso realmente importa para você?

Além de tudo o mais, seu primeiro exemplo parece bom. Segure em frente e resolva problemas reais. :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top